walkor / walkor/webman-framework

使用 PHPUnit 設定時環境變數會被 .env 覆蓋

Open
#119 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
148
Forks
68
Avg merge
1d 8h
Merged PRs (30d)
3

Description

### 重現步驟

依照[文件](https://webman.workerman.net/doc/en/components/unitest.html)先安裝 phpunit並設定

假設我有個 `phpunit.xml` 如下:

```xml



tests





```

接著修改 `config/redis.php` 讓他讀取 `.env` 的設定:

```php
// 測試過 env() 或是 getenv() 都一樣
return [
'default' => [
'host' => env("REDIS_HOST"),
'password' => env("REDIS_PASSWORD"),
'port' => env("REDIS_PORT"),
'database' => env("REDIS_DATABASE"),
],
];
```

最後看一下相關的 .env 內容:

```
REDIS_DATABASE = 0
REDIS_PREFIX = 'webman_'
```

一般來說,測試開始,應該會先啟動專案再讀取環境變數。以 Laravel 來說,會先讀取 `.env` 後再吃到 `phpunit.xml` 中設定的環境變數,讓本地也能使用測試環境變數跑測試。依此邏輯,跑測試時環境變數應該分別是:

```php
dump(env('REDIS_DATABASE')); // "1"
dump(env('REDIS_PREFIX')); // "testing_"
dump(env('APP_ENV')); // "testing"
```

可是 webman 經過來回 debug 後發現,流程是相反的!會先讀取 `phpunit.xml` 的環境變數,再讀取 `.env`,變成跑測試時實際上也是使用當下的 .env 設定。所以目前環境變數讀出來會是:

```php
dump(env('REDIS_DATABASE')); // "0"
dump(env('REDIS_PREFIX')); // "webman_"
dump(env('APP_ENV')); // "testing"
```

而 `APP_ENV` 因為在 `.env` 中並未設定,所以可以正確地讀取到 `phpunit.xml` 的設定。

以上 dump 寫在 [`support/bootstrap.php` 中 Dotenv 讀取邏輯 if](https://github.com/walkor/webman-framework/blob/1.6/src/support/bootstrap.php#L45) 的前與後。

------

原本是要發在 webman repo,不過爬文後發現這邊有這個 [issue](https://github.com/walkor/webman-framework/issues/95) 所以改發來這邊。

的確一般情況下應該是 .env 優先於環境變數;不過在測試情況下,該怎麼解決這部分呢?

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.