PHPUnit 如何模拟或更改类常量的值

PHPUnit how to mock or change the value of a class constant

提问人:HerbertRedford 提问时间:10/20/2023 最后编辑:HerbertRedford 更新时间:10/26/2023 访问量:46

问:

我有一个类,它有一个常量,该常量可由类中的各种方法访问。它长期以来一直是一个常量(遗留代码),我们不想将其更改为常规 var,所以我坚持使用它。

const SCHEMA_REPO = [
         "MailNotice" => MailNotice::class,
    ];

现在,我正在尝试为访问此常量的方法编写测试。但是我不想使用数组的任何值,我想使用测试值,所以我想知道是否可以在我的测试中更改值。例如,我想成为:SCHEMA_REPOSCHEMA_REPO

const SCHEMA_REPO = [
         "TestNoticeA" => "TestNoticeA",
         "TestNoticeB" => "TestNoticeB",
    ];

我正在使用 PHPUnit 和 Mockery。在嘲讽文档中,有一种叫做常量映射(https://docs.mockery.io/en/latest/cookbook/class_constants.html#constants-map)的东西,它应该允许你改变一个类中常量的值,用于测试,但它不起作用。我在测试中有:

\Mockery::getConfiguration()->setConstantsMap([
    Repo::class => [
        'SCHEMA_REPO' => [
             'TestNoticeA' => 'TestNoticeA',
             'TestNoticeB' => 'TestNoticeB'
        ],
    ]
]);

$mock = \Mockery::mock(Repo::class);
var_dump($mock::SCHEMA_REPO); // should be ['TestNoticeA' => 'TestNoticeA']

当我打印时,我希望看到,但我看到了以下实际值:$mock::SCHEMA_REPO['TestNoticeA' => 'TestNoticeA']SCHEMA_REPO

[
         "MailNotice" => MailNotice::class
   ]

我做错了什么吗?或者这不是常量映射应该用于的用途?

有没有办法实现我的要求?

谢谢

php 单元测试 测试 phpunit

评论


答:

1赞 Abdul Rahman Al Hourani 10/23/2023 #1

你应该测试函数而不是类,我会解释我的意思

假设您需要执行一个函数来获得任何给定数字的两倍数量

测试将是这样的

public function testMyFunction(int $inputNumber): void
{
    assertEqual(2 * $inputNumber, myFunction($inputNumber));
}

现在你可以像这样实现:

class MyClass {

    public function myFunction($inputNumber): int
    {
        return $inputNumber * 2;
    }
}

但你也可以做:

class MyClass {

    const MULTIPLY_AMOUNT = 2;

    public function myFunction($inputNumber): int
    {
        return $inputNumber * self::MULTIPLY_AMOUNT;
    }
}

这也很好,现在的情况是你不能将MULTIPLY_AMOUNT作为夹具(你不应该将其视为输入和测试用例),如果你尝试传递不同的值以确保测试通过, 每当您更改MULTIPLY_AMOUNT的值时,您都在更改功能,失败是正常行为,因为这不再获得双倍的数量

您应该依赖于常量的值,因为它是功能的一部分,如果常量值更改没有更改功能,则这不是常量,而是配置

我希望这对您有所帮助

评论

0赞 HerbertRedford 10/24/2023
阿卜杜勒,对不起,我的错。我在输入问题时出错。我已经更新了问题。基本上,我完全符合您在评论的第一部分中指出的内容,但是类常量的值被打印出来,而不是我试图覆盖的值。如果可能的话,我希望能够覆盖仅用于测试的常量,正如我在问题中提到的,即使进行简单的更改,我们也不想实际接触代码
0赞 Abdul Rahman Al Hourani 10/26/2023
我还为您更新了值,希望这对您有所帮助,您可能不喜欢它,但我认为甚至考虑嘲笑恒定是不正确的,祝您好运