PHPUnit:期望方法含义
Posted
技术标签:
【中文标题】PHPUnit:期望方法含义【英文标题】:PHPUnit: expects method meaning 【发布时间】:2011-11-17 22:45:44 【问题描述】:当我创建一个新的模拟时,我需要调用 expects 方法。它到底是做什么的?它的论点呢?
$todoListMock = $this->getMock('\Model\Todo_List');
$todoListMock->expects($this->any())
->method('getItems')
->will($this->returnValue(array($itemMock)));
我在任何地方都找不到原因(我已经尝试过文档)。我已经阅读了来源,但我无法理解。
【问题讨论】:
【参考方案1】:expects() - 设置你期望一个方法被调用的次数:
$mock = $this->getMock('nameOfTheClass', array('firstMethod','secondMethod','thirdMethod'));
$mock->expects($this->once())
->method('firstMethod')
->will($this->returnValue('value'));
$mock->expects($this->once())
->method('secondMethod')
->will($this->returnValue('value'));
$mock->expects($this->once())
->method('thirdMethod')
->will($this->returnValue('value'));
如果你知道,该方法在 expects() 中使用 $this->once() 调用一次,否则使用 $this->any()
见:phpUnit mock with multiple expects() calls
https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubs
http://www.slideshare.net/mjlivelyjr/advanced-phpunit-testing
【讨论】:
如果调用一次,然后再次调用会发生什么? 如果预期调用一次的方法会被调用多次,测试可能会失败 谢谢大家!你做得很好! 缺少 ) 和每个结尾 ->will()。 我想知道方法 expects() 背后的原因。我所能看到的是,如果我给出 any() 的论点,它会起作用。在模拟对象时,似乎不需要这种方法。我需要进一步了解这个主题。我知道这一定是有原因的。【参考方案2】:查看源代码会告诉你:
/**
* Registers a new expectation in the mock object and returns the match
* object which can be infused with further details.
*
* @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
* @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
*/
public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
PHPUnit 手册在
列出了可用的匹配器 https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects.tables.matchersany() 返回一个匹配器,当它被评估的方法被执行零次或多次时匹配。 never() 返回一个匹配器,当它被评估的方法从未被执行时匹配。 atLeastOnce() 返回一个匹配器,当它被评估的方法至少执行一次时匹配。 once() 返回一个匹配器,当它被评估的方法只执行一次时匹配。 exactly(int $count) 返回一个匹配器,当它被评估的方法被执行 $count 次时匹配。 at(int $index) 返回一个匹配器,当它被评估的方法在给定的 $index 处调用时匹配。
【讨论】:
请注意 at() 从 0 开始。我今天通过反复试验发现了这一点。 还要注意at()
对模拟对象上的所有存根方法使用相同的计数器。它不会为每个方法分配一个新的计数器。以上是关于PHPUnit:期望方法含义的主要内容,如果未能解决你的问题,请参考以下文章
PHPUnit Mock Objects 默认情况下从不期望