使用PHPUnit测试受保护方法的最佳实践
我发现了关于你是否测试私有方法信息的讨论。
我已经决定,在一些课堂上,我想要有受保护的方法,但是要测试它们。 其中一些方法是静态的和简短的。 因为大多数公共方法都使用它们,所以我可能会稍后安全地移除测试。 但是从TDD方法开始并避免调试,我真的想要测试它们。
我想到了以下几点:
最佳做法是什么? 还有别的事吗?
看起来,JUnit会自动将受保护的方法更改为公开,但我没有深入了解它。 PHP不允许通过反射。
如果您将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(...));
...
}
你似乎已经知道了,但我只是重申它; 这是一个不好的迹象,如果你需要测试受保护的方法。 单元测试的目的是测试一个类的接口,受保护的方法是实现细节。 也就是说,有些情况下它是有道理的。 如果使用继承,则可以将超类看作为子类提供接口。 所以在这里,你将不得不测试受保护的方法(但从来没有私人的方法)。 解决这个问题的方法是创建一个用于测试目的的子类,并使用它来公开这些方法。 例如。:
class Foo {
protected function stuff() {
// secret stuff, you want to test
}
}
class SubFoo extends Foo {
public function exposedStuff() {
return $this->stuff();
}
}
请注意,您始终可以用组合来替换继承。 在测试代码时,处理使用此模式的代码通常要容易得多,因此您可能需要考虑该选项。
teastburn有正确的方法。 更简单的是直接调用方法并返回答案:
class PHPUnitUtil
{
public static function callMethod($obj, $name, array $args) {
$class = new ReflectionClass($obj);
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method->invokeArgs($obj, $args);
}
}
你可以简单地在你的测试中通
$returnVal = PHPUnitUtil::callMethod(
$this->object,
'_nameOfProtectedMethod',
array($arg1, $arg2)
);
链接地址: http://www.djcxy.com/p/64549.html
上一篇: Best practices to test protected methods with PHPUnit
下一篇: How to share webpage image with description into Facebook page?