【问题标题】:How to run tests with and without constants?如何在有和没有常量的情况下运行测试?
【发布时间】:2021-03-25 01:13:50
【问题描述】:

我创建了一个小型库,需要用户设置一个秘密常量才能使其工作。

这是我的代码的一部分:

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 运行测试,为某些测试定义常量,但不是为所有测试定义常量?

【问题讨论】:

    标签: php constants phpunit


    【解决方案1】:

    这里有一些想法:

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

    2. runkit 扩展
      runkit pecl 扩展有一个function 来删除一个已经定义的常量。不过,您的测试将依赖于该扩展,这不是很好。

    3. 把它移到别的地方
      当您测试的主题不依赖于全局变量时,通常是最好的。将密钥移动到配置对象可以更容易测试,并且用户更难忘记配置所需的设置。

    【讨论】:

    • 谢谢,它有效!对于所有在我之后阅读该问题的人,我将define('SOMELIB_SECRET', 'ThisIsTheSecretForTests'); 放在一类的setUp() 中并使用processIsolation。缺点:它会大大减慢测试速度,因此请准备好增加测试时间(对我来说是 x25)。
    • 至于其他解决方案,我不喜欢#2(显然你也一样),我同意#3 将是完美的。不幸的是,其他原因迫使我坚持不变。不过,我会记住这一点!
    猜你喜欢
    • 2023-01-09
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    相关资源
    最近更新 更多