小编Kla*_*usK的帖子

使用私有/受保护常量测试类

在测试类方法时,有时我需要将返回值与某个类中定义的某个常量进行比较。

class FooBar
{
    const RANDOM = 18;
}
....
// Somewhere in test...
$this->assertEquals(FooBar::RANDOM, $mock->doSomething());
Run Code Online (Sandbox Code Playgroud)

现在,从 PHP 7.1 开始,可以使用可见性修饰符定义类常量,这可以更改为:

private const RANDOM = 18;
Run Code Online (Sandbox Code Playgroud)

然而,这会阻止测试工作,因为现在我们正在尝试访问私有常量。

所以现在我们有两个选择:

  1. 将常量声明为公共常量。
  2. 在测试中使用反射。这意味着测试变成:

$this->assertEquals( (new ReflectionClass(FooBar::class))->getConstant('RANDOM'), $mock->doSomething() );

第一种方法感觉非常错误,因为我们只是为了测试而不断公开,而不是因为类/层次结构/业务模型需要它公开。

第二个感觉也不对劲,因为任何 IDE 都找不到这个用例,因此任何搜索/替换/重构都会在这里失败。

所以我的问题是,是否应该使用第二种场景而不关心重构会破坏测试?或者甚至可能在断言中不鼓励使用一般常量?

unit-testing constants access-modifiers php-7.1

6
推荐指数
1
解决办法
2486
查看次数