一尘不染

使用PHPUnit测试受保护方法的最佳实践

php

我已经决定,在某些类中,我想拥有受保护的方法,但要对其进行测试。这些方法中的一些是静态的且简短的。因为大多数公共方法都使用了它们,所以以后我可能可以安全地删除测试。但是,为了从TDD方法入手并避免调试,我真的想对其进行测试。

我想到了以下几点:

*建议的“ 方法对象”似乎对此过于矫kill过正。
* 从公共方法开始,当更高级别的测试提供了代码覆盖范围时,请将其置于保护状态并删除测试。
* 继承具有可测试接口的类,使受保护的方法公开

哪个是最佳做法?还有别的事吗?

看起来,JUnit会自动将受保护的方法更改为公共方法,但是我对此没有更深入的了解。PHP不允许通过反射进行此操作。


阅读 223

收藏
2020-05-29

共1个答案

一尘不染

如果您将PHP5(> = 5.3.2)与PHPUnit一起使用,则可以在运行测试之前通过使用反射将其设置为公共来测试私有和受保护的方法:

protected static function getMethod($name) {
  $class = new ReflectionClass('MyClass');
  $method = $class->getMethod($name);
  $method->setAccessible(true);
  return $method;
}

public function testFoo() {
  $foo = self::getMethod('foo');
  $obj = new MyClass();
  $foo->invokeArgs($obj, array(...));
  ...
}
2020-05-29