【问题标题】:How to force an environment variable to a certain value inside phpunit test?如何在phpunit测试中强制环境变量为某个值?
【发布时间】:2016-02-18 10:49:52
【问题描述】:

在我的 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 文件中配置它。

【问题讨论】:

  • 使用 PhpStorm 运行测试时,该值也会被忽略。 (使用 PHP 5.6.24 和 PHPUnit 5.7.0 测试)

标签: php phpunit environment-variables


【解决方案1】:

这种方式对我有用(用 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 9.5.10 相关。
【解决方案2】:

环境变量在PHPUnit_Util_Configuration::handlePHPConfiguration() 中设置,实际上是这样的:

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

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

【讨论】:

  • 我不明白你的最后一句话:“当你在它的时候,你也可以立即将它设置为所需的值。”什么意思?
  • 我会直接使用ENVIRONMENT=test而不是ENVIRONMENT=取消设置值以使XML生效,仅此而已。
  • 我目前正在考虑采用@gontrollez 指出的引导方式,并将它们设置为我喜欢的值。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 2014-02-20
    • 2022-08-11
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 2019-01-21
    相关资源
    最近更新 更多