期望PHPUnit中的变量参数列表

时间:2013-11-19 17:25:59

标签: php mocking phpunit

我有一个适配器,它有一个方法获取一个变量参数列表,并将它转发给一个方法,该方法在我正在使用的框架中获取相同的参数。我想测试我的适配器正确转发参数。但是我不希望我的测试知道框架支持哪种参数。

我的工作期望如下:

$context->expects( $this->once() )
    ->method( 'msg' )
    ->with(
        $this->equalTo( $someMessageArguments[0] ),
        $this->equalTo( $someMessageArguments[1] ),
        $this->equalTo( $someMessageArguments[2] )
    );

这显然不好,因为它假设变量列表的长度为3.我想使用数据提供程序并测试不同的长度,在这种情况下,此代码不会删除它。

通过PHPUnit API有没有明智的方法来做到这一点?我把它砍掉了,虽然看起来也很邪恶,但它也有效:

$invocationMocker = $context->expects( $this->once() )
    ->method( 'msg' );

$invocationMocker->getMatcher()->parametersMatcher
    = new PHPUnit_Framework_MockObject_Matcher_Parameters( $someMessageArguments );

如果没有办法通过PHPUnit API很好地完成这项工作,那么有没有比这里列出的更好的方法?

2 个答案:

答案 0 :(得分:2)

我还没有找到使用PHPUnit模拟的方法。

使用Mockery,您可以实现:

$mock->shouldReceive('msg')
     ->once()
     ->withArgs($someMessageArguments);

就我个人而言,我通常更喜欢Mockery而不是PHPUnit模拟。

https://github.com/padraic/mockery

答案 1 :(得分:1)

我需要对withConsecutive做类似的事情。

在构建了用于连续调用的参数数组之后,使用了以下内容。

$invocationMocker->getMatcher()->setParametersMatcher(new Matcher\ConsecutiveParameters($arguments));

自原始文章以来,PHPUnit接口和名称空间已经发生了一些变化。