[英]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.