未能在Laravel 5.5中将APP_ENV设置为“测试”以进行单元测试

时间:2018-01-12 13:47:06

标签: laravel phpunit

我在Homestead-7上使用Laravel 5.5,phpunit 6.5.5(我认为)。

我正在尝试本教程:https://laravel-news.com/your-first-laravel-application(这应该会告诉你很多关于我对框架的体验)

测试失败(由于TokenMismatchException),我设法找到APP_ENV变量被设置为local的根本原因,尽管我已经尝试了很多种设置方法它到testing

最后,让我克服这个问题的原因是设置变量如下:

APP_ENV=testing vendor/bin/phpunit

然后,测试成功完成。

我的问题是,我做错了什么?上面的hack显然不是最好的方法。必须有办法正确地做到这一点。

更新

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>

提前感谢您的时间。

2 个答案:

答案 0 :(得分:5)

来自the Laravel docs

  

当通过phpunit运行测试时,由于testing文件中定义的环境变量,Laravel会自动将配置环境设置为phpunit.xml

...所以我敢打赌你的phpunit.xml文件丢失或配置错误。它应该在项目的根目录中,并且应该包含以下内容:

<php>
    <env name="APP_ENV" value="testing"/>
    ...
</php>

如果你在正确的位置有一个phpunit.xml文件而 包含上面的部分,那么仍然不工作,然后尝试清除配置缓存:

php artisan config:clear

如果仍然无法修复它,那么我会检查phpunit.xml文件中的奇怪内容,例如错误名称或包含语法错误。

here's a link原始phpunit.xml文件,以帮助您在需要时恢复它。

答案 1 :(得分:1)

我设法找到了我系统的问题。在我的宅基地框中,我已经包含在全球环境变量APP_ENV的Homestead.yaml设置中:

variables:
    - key: APP_ENV
    - value: local

这是作为Homestead设置说明中的示例提供的。我没有意识到我在做什么就跟着它。

再次通过.envphpunit.xml设置变量不起作用。我从Homestead.yaml中删除了定义,它的工作原理与我预期的一样。