【问题标题】:PHPUnit mock with multiple expects() calls具有多个期望()调用的 PHPUnit 模拟
【发布时间】:2011-08-15 14:52:09
【问题描述】:

使用 PHPUnit,我想知道我们如何从同一个 stub/mock 中获得多个期望。

例如,我想测试模拟是否会调用 display() 方法并返回 NULL。我也想测试一下process()这个方法会不会被调用。

其实我的测试叫做testProcessIsCalledIfDisplayReturnNull()

所以我需要在同一个模拟对象上设置 2 个期望值,而手册对此并没有真正的帮助:(

【问题讨论】:

    标签: mocking phpunit expectations


    【解决方案1】:

    如果你知道,该方法在 expects() 中使用 $this->once() 调用一次,否则使用 $this->any()

    $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'));
    

    【讨论】:

    • 据我了解,仅当认为该方法只调用一次很重要时才应使用 once() - 当调用该方法的代码多于或少于一次应被视为已损坏时。如果当前实现调用它一次,但将来可以将其更改为零或更多,则使用 any()。这使得将来更改代码变得更加容易。
    【解决方案2】:

    我已经尝试过了,只要调用顺序保持良好,它似乎就可以工作:

    $mock = $this->getMock('mockWorker', array('display', 'process'));
    $mock->expects($this->exactly(1))
         ->method('display')
         ->will($this->returnValue(null));
    $mock->expects($this->exactly(1))
         ->method('process');
    

    【讨论】:

    • 您可以使用once() 代替exactly(1)。请记住,这不会在两个期望之间创建排序,但通常已经足够好了。如果您需要具体订购,请使用at($index)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2020-09-01
    • 2014-11-14
    • 2017-03-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多