在测试方法A中,多次调用方法B.我想断言这些调用中至少有一个使用特定的参数,但我不关心何时进行调用。
如何构建一个PHPUnit测试来断言呢?
我在Google和StackOverflow上搜索了没有运气的解决方案,而且文档也没有得到很多帮助。
我尝试过使用这个辅助函数:
protected function expectAtLeastOnce( $Mock, $method, $args = array() ) {
$ExpectantMock = $Mock->expects( $this->atLeastOnce() )->method( $method );
$this->addWithArgsExpectation( $args, $ExpectantMock );
}
然而,这不起作用,因为它希望每个调用都使用指定的参数,即使它接受任何数量的调用都超过无。
类似的问题:
->at()
,这需要了解调用顺序,因此不是解决方案protected function assertMethodCallsMethodWithArgsAtAnyTime(
$InquisitiveMock,
$inquisitiveMethod,
$InitiatingObject,
$initiatingMethod,
$expectedArgs = array()
) {
$success = false;
$argsChecker = function () use ( &$success, $expectedArgs ) {
$actualArgs = func_get_args();
if (
count( $expectedArgs ) === count( $actualArgs )
&& $expectedArgs === $actualArgs
) {
$success = true;
}
};
$InquisitiveMock->expects( $this->any() )
->method( $inquisitiveMethod )
->will( $this->returnCallback( $argsChecker ) );
$InitiatingObject->$initiatingMethod();
$this->assertTrue( $success );
}
答案 0 :(得分:1)
也许不是很优雅,但是您可以使用回调手动检查方法参数,并在找到正确的参数时设置标志:
$mock = $this->getMock('Class', array('theMethod'));
$call_done = false;
$params_checker = function() use (&$call_done) {
$args = func_get_args();
if (1 == count($args) && "A" == $args[0]) {
$call_done = true;
}
};
$mock->expects($this->any())
->method('theMethod')
->will($this->returnCallback($params_checker));
$mock->theMethod("A");
$this->assertTrue($call_done);