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

How to force an environment variable to a certain value inside phpunit test?

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

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

我在错误的假设下工作,它总是将环境变量设置为值 test。然而,当系统已经设置了变量时,它会更喜欢已经存在的值。

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

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

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

我也想避免以某种方式调用 phpunit 只是为了获得正确的环境变量。

所以虽然这有效:

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

如果可能的话,我宁愿在 phpunit.xml 文件中配置它。

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

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

看起来,如果不先取消设置变量,就无法绕过此检查。当您使用它时,您也可以立即将其设置为所需的值。

您可以从 bootstrap 文件中设置 env 变量。可以从 phpunit.xml 文件中选择 bootstrap 文件,这样结果就是您要查找的内容。

这种方式对我有用(使用 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 added this to the PHPUnit 6.3 milestone on 4 Jul 2017