php - PHPUnit 中需要可变参数列表

标签 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 很好地完成此操作,是否有一种方法比此处列出的两种方法更好?

最佳答案

我还没有找到使用 PHPUnit 模拟来做到这一点的方法。

使用 Mockery,您可以实现:

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

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

https://github.com/padraic/mockery

关于php - PHPUnit 中需要可变参数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20078008/

相关文章:

PHPUnit:测试完成后如何从数据库中删除测试数据?

javascript - 如何使用调用 PHP 脚本的 AJAX 接收数组?

php - 如何给php网站添加评论区

python - 在修补导入的模块时模拟返回 ImportError

unit-testing - Grails-在单元测试中模拟servletContext

PHPUnit 模拟对象问题

php - 在php中将对象推送到数组时,所有对象都是相同的

php - 获取最近 30 天的 mysql 结果

php - 使用 PHPUnit 测试 mt_rand 函数

mocking - PHPUnit 如何获取模拟方法的真实返回值?