[英]php artisan test still loads .env instead of .env.testing
這些是我的配置:
phpunit.xml:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles="true">
<include>
<directory suffix=".php">./app</directory>
</include>
</coverage>
<php>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
.env.testing
APP_NAME=metrina
APP_ENV=testing
APP_KEY=base64:***************************
APP_DEBUG=true
APP_URL=http://localhost:81
# ...
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3307
DB_DATABASE=testing
DB_USERNAME=root
DB_PASSWORD=
DB_ENGINE=InnoDB
# ...
和.env
:
APP_NAME=metrina
APP_ENV=local
APP_KEY=base64:***************************
APP_DEBUG=true
APP_URL=http://localhost:81
#...
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3307
DB_DATABASE=actual
DB_USERNAME=root
DB_PASSWORD=
DB_ENGINE=InnoDB
#...
這是我的功能測試:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class TradeTest extends TestCase
{
use RefreshDatabase;
/**
* A basic feature test example.
*
* @return void
*/
public function test_example()
{
$databaseName = \DB::connection()->getDatabaseName();
dd($databaseName);
}
}
$ php artisan test
的結果:
Testing started at 11:11 PM ...
PHPUnit 9.5.10 by Sebastian Bergmann and contributors.
"actual"
Process finished with exit code 1
主要問題是測試不使用 my.env.testing,否則它必須返回
"testing"
代替
"actual"
我已經嘗試過
php artisan optimize
這僅在我首先手動刪除./bootrap/cache
目錄的內容然后使用以下命令運行測試時才有效
$ php artisan test --env=testing
最后,我找到了解決方案。 這不是許可或任何東西
這是laravel希望所有用戶處理測試的方式。
Laravel 認為所有用戶在不同的計算機上運行他們的測試和開發,或者只是他們希望我們擁有 docker 容器。
對我來說,如果我必須在我的 windows 上使用 docker,那么使用 memory 的成本很高。
所以我寧願不使用 windows 和 wamp 以外的任何東西。
在我的情況下,解決方案是定義一個新的地方來緩存配置以進行測試。
我對 phpunit.xml 做了一點改動,並為phpunit.xml
定義了一個新位置, APP_CONFIG_CACHE
所示。
phpunit.xml
:
<!-- ... -->
<php>
<!-- ... -->
<server name="APP_CONFIG_CACHE" value="bootstrap/cache/config-testing.php" force="true"/>
<!-- ... -->
</php>
<!-- ... -->
但這還不夠,因為 laravel 不會在CreatesApplication
trait 中自行緩存配置,所以我也必須在那里進行一些更改:
./tests/CreatesApplication.php
:
<?php
namespace Tests;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\Artisan;
trait CreatesApplication
{
/**
* Creates the application.
*
* @return Application
*/
public function createApplication(): Application
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make(Kernel::class)->bootstrap();
// create config cache manually
Artisan::call('config:cache');
return $app;
}
}
php artisan config:cache
will recreate config cache but in my case If I don't change anything in.env
file, or config files, then I don't need to runphp artisan optimize
orphp artisan config:clear
and my web pages在瀏覽器中工作正常,我也可以在.env.testing 文件中進行更改,而無需擔心每次我想在測試模式和 web 模式之間切換時,我必須處理配置緩存。
Laravel 在緩存配置后不會加載.env
文件。 Laravel 警告說,環境變量只能在配置文件中訪問,所以一旦配置文件被緩存,就沒有理由再加載.env
文件了。
在這種情況下,Laravel 的期望是不在您的開發環境中緩存您的配置。 僅在生產環境中緩存您的配置。
如果您在部署過程中執行
config:cache
命令,您應該確保您只從配置文件中調用env
function。 一旦配置被緩存,.env
文件將不會被加載; 因此,env
function 只會返回外部的系統級環境變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.