PHPUnit 模拟对象默认情况下永远不会期望

问题描述 投票:0回答:3

如果没有正式定义的期望,有没有办法告诉 phpunit 模拟对象永远不要期望方法调用?

mocking phpunit expectations
3个回答
15
投票

在我看来,永远不要对每种方法都抱有期望是没有道理的。所以 phpunit 没有任何功能。仅当您想完全确保某些方法不会被调用时,才应该使用“从不”期望。

无论如何,你可以使用一些匹配器来更接近你的目标。例子:

永远不要期望所有对象的方法(如果调用任何模拟方法就会失败):

$mock->expects($this->never())
    ->method($this->anything());

因此,例如,您可以测试某些对象不会调用除测试方法之外的任何方法:

$mock = $this->getMock('Some\Tested\Class', array('testedMethod'));
$mock->expects($this->never())
    ->method($this->anything());

您也可以尝试使用其他匹配器,例如。

matchesRegularExpression

$mock->expects($this->never())
    ->method($this->matchesRegularExpression('/get.*/'));

例如上面的例子,如果调用任何 getter 方法就会失败。

我知道这并不完全是你想要的,但恐怕 phpunit 没有这样的解决方案。


1
投票

如果您想测试在给定特定参数时永远不会调用某个方法,请使用

$mock->expects($this->any())
->method('foo')
->with(new PHPUnit_Framework_Constraint_Not('bar'));

0
投票

从 PHPUnit 7.2 开始,您可以使用类似问题中的 这个答案。要使所有意外的模拟方法调用都导致失败,请重写

TestCase::getMockBuilder()
方法:

public function getMockBuilder(string $className): MockBuilder
{
    return parent::getMockBuilder($className)->disableAutoReturnValueGeneration();
}
© www.soinside.com 2019 - 2024. All rights reserved.