如何在phpunit测试中强制将环境变量设置为某个值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在phpunit测试中强制将环境变量设置为某个值?相关的知识,希望对你有一定的参考价值。

在我的phpunit中我有这个配置:

<php>
    <env name="ENVIRONMENT" value="test"/>
</php>

我在错误的假设下工作,它始终将环境变量设置为值test。然而,当系统已经具有变量集时,则它更喜欢已存在的值。

$ export ENVIRONMENT=GNARF
$ phpunit -c test/phpunit.xml

所以在测试中,env('ENVIRONMENT')的价值将是"GNARF",即使我期待"test"

有没有办法让phpunit将env设置视为默认值而不是它应该使用的确定值?

我也想避免以某种方式调用phpunit来获得正确的env变量。

所以虽然这有效:

ENVIRONMENT="test";./vendor/bin/phpunit -c tests/phpunit.xml

我想在可能的情况下在phpunit.xml文件中配置它。

答案

这种方式对我有用(用PHPUnit 6.5测试):

<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="MyProject">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
    <php>
        <env name="API_KEY" value="fakeApiKey" force="true" />
    </php>
</phpunit>

这是pull request,他们添加了这个新功能(如果你感兴趣的话)。

sebastianbergmann于2017年7月4日将其添加到PHPUnit 6.3里程碑中

另一答案

环境变量在PHPUnit_Util_Configuration::handlePHPConfiguration()中设置,实际上,它看起来像这样:

foreach ($configuration['env'] as $name => $value) {
    if (false === getenv($name)) {
        putenv("{$name}={$value}");
    }
    if (!isset($_ENV[$name])) {
        $_ENV[$name] = $value;
    }
}

看起来,没有办法在不首先取消变量的情况下绕过这个检查。当你在它的时候,你也可以立即将它设置为所需的值。

另一答案

您可以从env文件中设置bootstrap变量。可以从phpunit.xml文件中选择引导程序文件,因此结果将是您要查找的内容。

以上是关于如何在phpunit测试中强制将环境变量设置为某个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Symfony 4中为测试环境设置数据库

审查员 - 跳过一些phpunits

如何从 phpunit.xml 而不是应用程序配置文件访问环境变量

phpunit 单元测试

我如何在超过 1 个网站上执行 phpunit 测试

windows 下 wamp php单元测试工具PHPUnit的安装