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

Posted

技术标签:

【中文标题】PHPUnit Mock Objects 默认情况下从不期望【英文标题】:PHPUnit Mock Objects never expect by default 【发布时间】:2012-11-29 11:37:29 【问题描述】:

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

【问题讨论】:

“从不指望”是什么意思?据我所知,您的意思是,如果模拟对象调用方法没有明确预期,那么测试应该总是失败?对吗? 是的,没错。我不想为每个不应该调用的方法写$mock->expects($this->never())->method('abc') 【参考方案1】:

在我看来,永远不要对每种方法都抱有期望。所以 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 没有这样的解决方案。

【讨论】:

太棒了,我不知道您可以为方法名称指定正则表达式。这样我可以说expected($this->never())->method('|^goodMethod|') 意味着它不应该调用任何方法,除了一个叫做goodMethod() 的方法。不完全符合 OP 的要求,但解决了我的问题。【参考方案2】:

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

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

【讨论】:

以上是关于PHPUnit Mock Objects 默认情况下从不期望的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit:使用Mock修改返回值?

PHPUnit Mock 多种不同的方法

PHPUnit “模拟方法不存在。”当使用 $mock->expects($this->at(...))

phpunit mock - 方法不存在

PHPUnit 4.8 Mock mysql 数据库接口

在链配置的命名空间 App\Entity [Symfony 5.3][PHPUnit 8.5] 中找不到类 Mock_*