如何在 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
在我的 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