【发布时间】:2019-04-04 23:00:08
【问题描述】:
在测试类方法时,有时我需要将返回值与某个类中定义的某个常量进行比较。
class FooBar
{
const RANDOM = 18;
}
....
// Somewhere in test...
$this->assertEquals(FooBar::RANDOM, $mock->doSomething());
现在从 PHP 7.1 开始可以使用可见性修饰符定义类常量,这可以更改为:
private const RANDOM = 18;
但是,这会阻止测试工作,因为现在我们正在尝试访问私有常量。
所以现在我们有两个选择:
- 将常量声明为公共。
- 在测试中使用反射。意味着测试变为:
$this->assertEquals(
(new ReflectionClass(FooBar::class))->getConstant('RANDOM'),
$mock->doSomething()
);
第一种方法感觉非常错误,因为我们不断公开只是为了测试,而不是因为类/层次结构/业务模型需要公开。
第二个感觉也不对,因为找不到这个用例 通过任何 IDE,因此任何搜索/替换/重构都会在这里失败。
所以我的问题是,是否应该在不关心重构会破坏测试的情况下使用第二种情况?或者,甚至在断言中应该不鼓励使用常量?
【问题讨论】:
标签: unit-testing constants access-modifiers php-7.1