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.matchers
any() 返回一个匹配器,当它被评估的方法被执行零次或多次时匹配。 never() 返回一个匹配器,当它被评估的方法从未被执行时匹配。 atLeastOnce() 返回一个匹配器,当它被评估的方法至少执行一次时匹配。 once() 返回一个匹配器,当它被评估的方法只执行一次时匹配。 exactly(int $count) 返回一个匹配器,当它被评估的方法被执行 $count 次时匹配。 at(int $index) 返回一个匹配器,当它被评估的方法在给定的 $index 处调用时匹配。

【讨论】:

请注意 at() 从 0 开始。我今天通过反复试验发现了这一点。 还要注意at() 对模拟对象上的所有存根方法使用相同的计数器。它不会为每个方法分配一个新的计数器。

以上是关于PHPUnit:期望方法含义的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit Mock Objects 默认情况下从不期望

PHPUnit Mock稍后改变期望

phpunit mock 方法多次调用不同参数

我如何在PHPUnit中测试require函数?期望E_COMPILE_ERROR

Symfony 5 Phpunit 未定义方法

laravel phpunit 如何确定运行哪个方法