我使用凭据创建了一个.env.testing文件,除了数据库的表名不同之外,其他所有内容都与.env相同。
我尝试了php artisan config:clear
,该操作删除了bootstrap/cache/config.php
中的缓存配置文件,并断开了数据库连接。如果我通过运行php artisan config:cache
重新缓存文件,则缓存的文件将返回,但.env.testing文件中没有凭据。当我重新运行PHPUnit时,它将连接到错误的数据库,该数据库名称存储在.env中,而不是.env.testing中。
这是真的吗?最新的Laravel版本是否破坏了测试环境?
文档内容如下:(在此处找到:https://laravel.com/docs/5.8/testing)
“您可以根据需要自由定义其他测试环境配置值。可以在phpunit.xml文件中配置测试环境变量,但是在运行测试之前,请确保使用config:clear Artisan命令清除配置缓存。 !
此外,您可以在项目的根目录中创建一个.env.testing文件。运行PHPUnit测试或使用--env = testing选项执行Artisan命令时,此文件将覆盖.env文件。“
UPDATE
我终于能够通过在phpunit.xml文件中添加数据库覆盖来覆盖.env中声明的数据库; .env.testing仍然无法正常工作。这些文档至少具有误导性。
答案 0 :(得分:5)
这对我有用:
在phpunit.xml
中,我必须在<env name="APP_ENV" value="testing"/>
块中定义<php>
,以使PhpUnit加载.env.testing
而不是.env
Laravel文档似乎是错误的,并且.env.testing
并没有在Laravel或PhpUnit中的任何地方进行硬编码,它会为APP_ENV
中指定的phpunit.xml
读取环境文件。您甚至可以将其重命名为.env.phpunit
或其他任何名称(如果您以phpunit.xml
<env name="APP_ENV" value="phpunit"/>
中定义)
答案 1 :(得分:2)
我在Laravel v7中遇到了同样的问题。我的手在头发上停留了很长时间,但我找到了解决方法。
.env.testing对我来说是一个失败的原因。我从来没有加载它,所以我只是将所有变量放在phpunit.xml中。为了使测试环境(php artisan test
)实际加载这些变量,我必须这样做:
首先,我必须将phpunit.xml中的APP_ENV
设置为force="true"
:
<php>
<server name="APP_ENV" value="testing" force="true"/>
<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>
然后我必须运行php artisan config:clear
,而不是:cache
。当我运行php artisan config:cache
时,它实际上不起作用。可能是因为它只缓存一次env,而从未根据不同的环境加载新设置。
答案 2 :(得分:1)
我在Laravel v5.6中遇到了同样的问题。我用不同的用户名,密码和数据库设置了一个.env.testing
文件,但是我的测试始终在主.env
数据库中运行。
似乎在运行config cache命令时需要指定测试环境。运行此命令后,它按文档中所述工作:
php artisan config:cache --env=testing
答案 3 :(得分:1)
为了仅在测试运行中运行 .env.testing ,并以默认行为运行 .env 。您将需要执行:
./vendor/bin/phpunit.bat // For windows
./vendor/bin/phpunit // For Linux
祝你好运
答案 4 :(得分:1)
似乎phpunit.xml
中定义的变量正在覆盖.env.testing
文件中定义的变量,而不是我们都期望的相反。
我建议在APP_ENV
中仅保留phpunit.xml
,然后从当前.env.testing
克隆.env
。它将按预期工作。
phpunit.xml
<php>
<server name="APP_ENV" value="testing"/>
<!-- Remove all others and define them in .env.testing -->
</php>
答案 5 :(得分:0)
您的.env.testing
是什么样的?
您的环境是否设置为APP_ENV=testing
?
当我进行测试时,我没有该功能,只在文件中包含我的数据库详细信息,它将无法正常工作,但是当我制作原始.env文件的复本并编辑环境以测试我的工作时。
答案 6 :(得分:0)
然后,如果可能使用phpstorm,
转到phpstorm的设置,或按Ctrl + Alt + S。
然后选择语言和框架-> PHP->测试框架 在“测试运行器”选项卡下,单击“默认配置文件”,然后选择(通过单击文件夹图标)项目的PHPUnit.xml文件的路径。
这将使您在xml文件中的所有更改生效。然后创建.env.testing文件,创建用于测试的首选数据库配置变量,然后再次运行测试!
答案 7 :(得分:0)
需要在phpunit.xml中设置APP_CONFIG_CACHE变量,避免测试和本地配置相互覆盖。
<server name="APP_ENV" value="testing"/>
<server name="APP_CONFIG_CACHE" value="cache/config-testing.php" force="true"/>