我想测试这个功能:
public function reset()
{
if(!$this->onBeforeReset()) // Protected, internal method
{
return false;
}
// Continue with tests
}
我希望在onBeforeReset
函数返回false或true时测试它
我怎样才能做到这一点?这可能吗?
有没有办法“模拟”被测试类的某些部分?
答案 0 :(得分:1)
是的,除非您想要模拟的方法是私有或最终的,否则您可以模拟这一方法。一个例子:
$sut = $this->getMock('Your\Class', array('onBeforeReset'));
getMock
方法的第二个参数是数组包含phpunit将模拟的方法。如果这个数组是空的,phpunit将模拟来自该对象的所有方法,但是如果你精确至少一个方法,那么phpunit只会模拟方法,你会传入这个数组。
你像往常一样模仿方法:
$sut->expects($this->any())
->method('onBeforeReset')
->will($this->returnValue(true));
最后,您可以测试要测试的方法:
$this->assertWhatever($expectedValue, $sut->reset());
答案 1 :(得分:0)
我如何理解unittesting,您是否测试了类的公共接口。因此,在您的示例中,您只断言reset()的结果,而不是内部调用的所有受保护和私有函数。然后你推断出onBeforeReset()从结果reset()给出的结果是什么。
这当然不是100%的规则。有时您真的想要测试私有或受保护的方法,无论出于何种原因(但是请注意,这可能意味着您实际上应该重构代码)。
PHPUnit的创建者写了一些想法并给出了一些例子(http://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。基本上,您使用Reflection来使私有和受保护的方法和属性可公开访问。