断言给定的参数无论调用顺序如何都会传递给方法

时间:2014-07-14 19:35:44

标签: phpunit

在测试方法A中,多次调用方法B.我想断言这些调用中至少有一个使用特定的参数,但我不关心何时进行调用。

如何构建一个PHPUnit测试来断言呢?

我在Google和StackOverflow上搜索了没有运气的解决方案,而且文档也没有得到很多帮助。

我尝试过使用这个辅助函数:

protected function expectAtLeastOnce( $Mock, $method, $args = array() ) {
    $ExpectantMock = $Mock->expects( $this->atLeastOnce() )->method( $method );

    $this->addWithArgsExpectation( $args, $ExpectantMock );
}

然而,这不起作用,因为它希望每个调用都使用指定的参数,即使它接受任何数量的调用都超过无。

类似的问题:

编辑:这是我对已接受答案的实施:

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 );
}

1 个答案:

答案 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);