PHPUnit 模拟 - 当方法调用 x 次时立即失败
使用 PHPUnit,我正在使用 ->at() 测试一系列方法调用,如下所示:
$mock->expects($this->at(0))->method('execute')->will($this->returnValue('foo'));
$mock->expects($this->at(1))->method('execute')->will($this->returnValue('bar'));
$mock->expects($this->at(2))->method('execute')->will($this->returnValue('baz'));
How can I set up the mock以便在上述场景中调用 ifexecute()四次或四次以上,会立即失败吗?我尝试了这个:
$mock->expects($this->at(3))->method('execute')->will($this->throwException(new Exception('Called)太多次了。')));
但是,如果execute() 没有被调用四次,这也会失败。它需要立即失败,否则被测系统会产生自己的错误,从而导致生成的错误消息不明确。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我最终设法找到了解决方案。我使用了
$this->returnCallback()
的组合并传递 PHPUnit 匹配器来跟踪调用计数。然后你可以抛出一个 PHPUnit 异常,这样你也能得到很好的输出:I managed to find a solution in the end. I used a comination of
$this->returnCallback()
and passing the PHPUnit matcher to keep track of the invocation count. You can then throw a PHPUnit exception so that you get nice output too:对于像这样的特殊情况,我通常使用如下内容:
For special cases like this, I typically use something like the following:
您可以将测试分成 2 个 依赖方法,使用@depends 注释。
在这种情况下,您的第一个测试仅测试是否有确切的 3 个方法执行,第二个测试是其他逻辑。
You could separate test to 2 dependent methods, using @depends annotation.
In this case your first test only tests that there are exact 3 method executions, and second - other logic.
使用 数据提供者?
这只是另一个想法,我认为 zerkms 也提出了非常好的想法
What about using data providers?
This is just another idea, and I think that zerkms suggested very good idea as well