Laravel PHPUnit 加载 .env.testing 文件

Posted

技术标签:

【中文标题】Laravel PHPUnit 加载 .env.testing 文件【英文标题】:Laravel PHPUnit loading .env.testing file 【发布时间】:2017-11-06 12:12:14 【问题描述】:

我在让 Laravel 为我的测试用例加载正确的 .env 文件时遇到了一些问题。 我正在使用 phpUnit,并在 phpunit.xml 中设置了以下 var:

<?xml version="1.0" encoding="UTF-8"?>
    <phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="bootstrap/autoload.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory suffix="Test.php">./tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
            <exclude>
                <file>./app/Http/routes.php</file>
            </exclude>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>

在我的 .env.testing 文件中,我有:

APP_ENV=testing
DB_CONNECTION=sqlite

我在 config/database.php 下建立了他的连接:

'sqlite' => [
     'driver' => 'sqlite',
     'database' => ':memory:',
     'prefix' => ''
]

它只是没有加载 .env.testing 文件。如果我在我的 TestCase.php 中这样做:

dd(env('APP_ENV'));

我仍然从我的 .env 文件中获得“发展”

我也尝试过使用:

$app->loadEnvironmentFrom('.env.testing');

就像线程here中建议的那样

有人知道可能出了什么问题吗?

【问题讨论】:

你使用的是什么版本的 Laravel? @RossWilson 我使用的是 5.2 版 你能分享你完整的 phpunit.xml 文件吗? @Sandeesh 我添加了 phpunit.xml 文件 我遇到了同样的问题,并在这里评论了一个解决方法,但后来我意识到我的引导脚本中有这个问题,而不是实际的测试。在我的情况下,问题是&lt;env name="APP_ENV" value="testing"/&gt; 在引导脚本中没有效果。在创建应用程序之前,我必须手动添加putenv('APP_ENV=testing');。如果您不是这种情况,您可以将其用作解决方法。 【参考方案1】:

我的问题很相似。环境文件 .env.testing 根本没有被读取。 我试图在我的测试文件中到处放一些 var_dump,一切正常,但即使是 var_dump(env("APP_NAME")) 也是空的。

我想输入一个“php artisan config:clear”,一切都恢复正常了。 不知道我做了什么,但它对我有用:)

【讨论】:

我试过php artisan config:cache,但没有帮助。当我尝试php artisan config:clear 时,它起作用了。我不知道有什么区别(清除应该包含在缓存命令中)但它以某种方式起作用 php artisan config:clear 将删除缓存的 config.php 文件并强制应用使用 configs 和 .env 中定义的内容 artisan config:clearartisan optimize:clear 的问题是,如果您有删除文件/文件夹的权限问题,它会静默失败。 感谢@Tyteck,我一直在努力让 phpunit 读取正确的 env 文件。尝试了 artisan config:clear 建议的许多帖子,但它什么也没做,在看到您的帖子后,我使用 sudo、sudo php artisan config:clear 运行,现在它可以正常工作了。【参考方案2】:

您正在运行功能测试还是单元测试?我认为单元测试应该只适用于模拟,而功能测试可能会持续到数据库中。

【讨论】:

【参考方案3】:

要加载.env.testing文件,你必须使用--env=testing执行artisan命令

【讨论】:

以上是关于Laravel PHPUnit 加载 .env.testing 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel PHPUnit 测试中获取响应变量?

Laravel 5:模型上的fresh()在PHPUnit中不起作用

laravel 4 无法让 phpunit 测试工作

将 phpunit 安装到 Laravel 4 站点

Laravel - PHPUnit 中的伪造路由

如何在 laravel 5.5 中运行 phpunit