模拟正在测试的当前类的内部函数调用

时间:2013-06-04 11:11:19

标签: php phpunit php-5.3

我想测试这个功能:

public function reset()
{
    if(!$this->onBeforeReset())      // Protected, internal method
    {
         return false;
    }

    // Continue with tests
}

我希望在onBeforeReset函数返回false或true时测试它 我怎样才能做到这一点?这可能吗?
有没有办法“模拟”被测试类的某些部分?

2 个答案:

答案 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来使私有和受保护的方法和属性可公开访问。