我有PHPUnit_Framework_MockObject_MockObject
一个Logger
。
在单元测试中,我不希望warn
通过特定的string参数调用该方法doNotCallMeWithThisString
。
我走了这么远:
public function testThis()
{
...
$logger = $this->getMockLogger();
$logger->expects($this->exactly(0))->method('warn')->with(
$this->equalTo('doNotCallMeWithThisString')
);
...
}
但这失败了,因为即使字符串参数是,也exactly(0)
将对该warn
方法的任何调用标记为错误somethingEntirelyUnrelated
。
我如何才能告诉模拟对象任何调用warn
都可以,除非使用该特定字符串调用它?
该exactly()
方法用于声明模拟方法将被调用多少次。除非您$this->at()
用于模拟行为,否则您不会为特定的调用指定参数。exactly(0)
表示通话次数应为0。
将您的模拟更改为此:
$logger->expects($this->any()) //Or however many times it should be called
->method('warn')
->with(
$this->callback(function($argument) {
return $argument !== 'doNotCallMeWithThisString';
})
)
);
这使用回调检查传递给模拟方法的参数,并验证该参数是否等于您的字符串。
PHPUnit文档具有约束类型,您可以使用约束类型来验证模拟的参数。目前,它没有不等于类型的字符串。但是,使用回调,您可以创建自己的回调。您的回调仅需要检查使用的参数,然后返回true
确定的参数,否则返回false
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句