Laravel 5.8 .env.testing文件不起作用

时间:2019-06-14 21:51:58

标签: laravel testing phpunit

我使用凭据创建了一个.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仍然无法正常工作。这些文档至少具有误导性。

8 个答案:

答案 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"/>