如何 运行 测试带和不带常量?

How to run tests with and without constants?

我创建了一个小型库,要求用户设置一个秘密常量才能运行。

这是我的部分代码:

if (!defined('SOMELIB_SECRET')) {
    throw new RuntimeException('You need to define the constant SOMELIB_SECRET to use this library');
}

这段代码效果很好,但我不知道如何测试抛出的异常。如果我在 phpunit.xml:

中创建常量,我可以测试所有内容
<php>
    <const name="SOMELIB_SECRET" value="ThisIsTheSecretForTests" />
</php>

如果我在PHP中添加常量,我可以测试异常。

我想做的是测试两者,我需要一种方法来取消中间常量的设置,这不是真正的事情(事实证明常量是......常量)。

我试图创建 2 个测试文件:001_SomeLibWithoutSecretTest.php002_SomeLibWithSecretTest.php,以便我可以在它们之间创建常量。它在 Linux 上有效,但现在我正在使用 Windows,测试以相反的方式调用。此外,它有点 hacky:tests should not have to be called in a given order.

介绍了这么多之后,这是我的简单问题:

如何使用 PHPUnit 进行 运行 测试,为某些测试定义常量而不是为所有测试定义常量?

这里有一些想法:

  1. 启用进程隔离
    启用 processIsolation 后,每个测试都将 运行 在一个独立的进程中。您必须从配置中删除您的常量并在 setUpsetUpBeforeClass 或直接在您需要它的测试中定义它。

  2. 运行套件扩展
    运行kit pecl 扩展有一个 function 来删除一个已经定义的常量。不过,您的测试将取决于该扩展名,这不是很好。

  3. 把它移到别处
    当您测试的主题不依赖于全局变量时通常是最好的。将秘密移至配置对象使测试更容易,用户更难忘记配置所需的设置。