php artisan test 仍然加载 .env 而不是 .env.testing
Posted
技术标签:
【中文标题】php artisan test 仍然加载 .env 而不是 .env.testing【英文标题】:php artisan test still loads .env instead of .env.testing 【发布时间】:2022-01-19 21:23:03 【问题描述】:这些是我的配置:
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
主要问题是测试没有使用我的.env.testing,否则它必须返回
"testing"
代替
"actual"
我已经尝试过
php artisan optimize
更新
这只有在我首先手动删除./bootrap/cache
目录的内容然后使用以下命令运行测试时才有效
$ php artisan test --env=testing
【问题讨论】:
您是否尝试通过--env
标志指定env
?即:php artisan --env=testing test
?
是的,我已经尝试过了,那么 laravel 承诺的意义何在? laravel.com/docs/8.x/testing#environment 在第一行说When running tests, Laravel will automatically set the configuration environment to testing...
!!我做错什么了吗?还是 Laravel 有错误?即使使用--env=testing。只有当我手动删除 ./bootstrap/cache/
文件时它才有效。
***.com/a/56308862/8015878 - 请试试这个答案,看看它是否能解决。
我也已经尝试过了,我的配置和设置都很好,默认情况下就是那个答案所说的。 :-(@WebMan
@WebMan 只有当我手动清除缓存目录时才有效
【参考方案1】:
当你缓存了你的配置时,Laravel 不会加载 .env
文件。 Laravel 警告说,环境变量只能在配置文件中访问,所以一旦配置文件被缓存,就没有理由再加载 .env
文件了。
在这种情况下,Laravel 的期望是不在您的开发环境中缓存您的配置。仅在生产环境中缓存您的配置。
来自documentation on config caching:
如果您在部署过程中执行
config:cache
命令,您应该确保您只是从配置文件中调用env
函数。一旦配置被缓存,.env
文件将不会被加载;因此,env
函数将只返回外部的系统级环境变量。
【讨论】:
以上是关于php artisan test 仍然加载 .env 而不是 .env.testing的主要内容,如果未能解决你的问题,请参考以下文章
Lumen php artisan config:找不到缓存