Laravel 5.5单元测试APP_ENV未自动设为testing的问题求助
解决Laravel 5.5 + PHPUnit 6.5.5测试时APP_ENV无法切换为testing的问题
你的phpunit.xml配置看起来是完全正确的,正常情况下Laravel会优先读取这个文件里的环境变量设置。在Homestead-7环境下出现这个问题,大概率是环境变量被其他地方覆盖了,下面给你几个排查和解决的方案:
1. 清除PHPUnit配置缓存
PHPUnit有时候会缓存配置信息,导致新的环境变量设置不生效。执行以下命令清除缓存:
vendor/bin/phpunit --clear-cache
2. 检查是否存在.env.testing文件
如果你的项目根目录下存在.env.testing文件,Laravel在测试环境下会优先加载这个文件里的配置。打开这个文件看看是不是把APP_ENV设置成了local,如果是的话,修改为testing即可。如果没有这个文件,也可以手动创建它,内容可以参考:
APP_ENV=testing CACHE_DRIVER=array SESSION_DRIVER=array QUEUE_DRIVER=sync DB_CONNECTION=sqlite DB_DATABASE=:memory:
3. 排查Homestead环境的全局环境变量
Homestead在启动时可能会通过配置文件或者脚本强制设置全局的APP_ENV变量:
- 打开
Homestead.yaml文件,检查是否有variables节点设置了APP_ENV=local - 查看Homestead的启动脚本(比如
~/.homestead/scripts下的文件),有没有强制设置环境变量的代码
如果发现相关配置,修改为testing或者直接移除这个全局设置。
4. 在测试类中强制设置环境变量(临时兜底方案)
如果上面的方法都无效,可以在测试基类(tests/TestCase.php)的setUp方法中强制设置环境变量,确保测试时环境正确:
protected function setUp(): void { parent::setUp(); // 强制设置APP_ENV为testing putenv('APP_ENV=testing'); config(['app.env' => 'testing']); }
为什么命令行APP_ENV=testing vendor/bin/phpunit有用?
这是因为在命令行开头设置的环境变量是进程级别的,优先级高于Laravel的配置文件和phpunit.xml的设置,所以能强制覆盖掉之前的local环境。但我们的目标是让phpunit.xml的配置生效,所以还是建议从上面的几个方向排查根源问题。
附上你提供的phpunit.xml配置(方便参考):
<?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" bootstrap="vendor/autoload.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false"> <testsuites> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> </whitelist> </filter> <php> <env name="APP_ENV" value="testing"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/> </php> </phpunit>
内容的提问来源于stack exchange,提问作者mirnis
相关产品推荐
相关产品推荐

