提问人:HerbertRedford 提问时间:10/20/2023 最后编辑:HerbertRedford 更新时间:10/26/2023 访问量:46
PHPUnit 如何模拟或更改类常量的值
PHPUnit how to mock or change the value of a class constant
问:
我有一个类,它有一个常量,该常量可由类中的各种方法访问。它长期以来一直是一个常量(遗留代码),我们不想将其更改为常规 var,所以我坚持使用它。
const SCHEMA_REPO = [
"MailNotice" => MailNotice::class,
];
现在,我正在尝试为访问此常量的方法编写测试。但是我不想使用数组的任何值,我想使用测试值,所以我想知道是否可以在我的测试中更改值。例如,我想成为:SCHEMA_REPO
SCHEMA_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
]
我做错了什么吗?或者这不是常量映射应该用于的用途?
有没有办法实现我的要求?
谢谢
答:
你应该测试函数而不是类,我会解释我的意思
假设您需要执行一个函数来获得任何给定数字的两倍数量
测试将是这样的
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的值时,您都在更改功能,失败是正常行为,因为这不再获得双倍的数量
您应该依赖于常量的值,因为它是功能的一部分,如果常量值更改没有更改功能,则这不是常量,而是配置
我希望这对您有所帮助
评论