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

l0oc07j2  于 2023-03-11  发布在  PHP
关注(0)|答案(4)|浏览(301)

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

vlju58qv

vlju58qv1#

这种方法对我很有效(用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里程碑中

holgip5t

holgip5t2#

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

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

看起来,如果不先取消变量的设置,就没有办法绕过这个检查,而当你在做这个检查时,你也可以立即将它设置为所需的值。

fsi0uk1n

fsi0uk1n3#

你可以从bootstrap文件中设置env变量,也可以从phpunit.xml文件中选择引导文件,这样你就会得到你想要的结果。

kupeojn6

kupeojn64#

这是我在Laravel\Lumen中创建代码的方法。我想测试代码在不同环境中的行为:

private function provideData(): array
{
    return [
        'tc_1'    => ['production', 'in', 'in'],
        'tc_2'    => ['development', 'in', 'str'],
        'tc_3'    => ['testing', 'in', 'str'],
    ];
}

/**
 * @dataProvider provideData
 * @return void
 */
public function testProvidedData(string $env, string $inStr, string $outStr)
{
    $_ENV['APP_ENV'] = $env;
    $this->assertSame($outStr, Class::method($inStr));
}

在Class::method()中,代码如下所示:

public static function method(string $inStr): string
{
    return (env('APP_ENV') === "production")
        ? $inStr
        : 'str';
}

相关问题