繁体   English   中英

如何使用PHPUnit和mock对象测试是否使用正确的参数调用相同的方法

[英]How can I test if same method is called with correct parameters with PHPUnit and mock object

我正在使用PHPUnit进行单元测试我使用模拟对象来测试是否使用正确的参数调用方法。 当我只想这样做一次时,这很好用。

    $logMock = $this->getMockBuilder('Logger')
            ->disableOriginalConstructor()
            ->getMock();

    //check if it updates the correct record
    $logMock->expects($this->exactly(1))
            ->method('updateLog')
            ->with(456, 'some status');

现在,我想测试是否第二次调用updateLog(使用不同的参数)。 我不知道如何用'with'方法做到这一点。

有人有建议吗?

我不知道你的嘲弄框架。 通常你只是创造另一个期望。 我认为这也应该适用于这个框架。

$logMock->expects($this->exactly(1))
         ->method('updateLog')
         ->with(100, 'something else');

编辑

似乎PHPUnit框架不支持对同一方法的多个不同期望。 根据此站点,您必须使用索引功能。

它会是这样的

$logMock->expects($this->at(0))
        ->method('updateLog')
        ->with(456, 'some status');
$logMock->expects($this->at(1))
         ->method('updateLog')
         ->with(100, 'something else');
$logMock->expects($this->exactly(2))
        ->method('updateLog');

从PHPUnit 4.2开始,您可以使用withConsecutive断言。 前提是您知道呼叫的顺序。 你的模拟看起来像这样:

$logMock->expects($this->exactly(2))
        ->method('updateLog')
        ->withConsecutive(
            array(456, 'some status')
            array(100, 'something else')
        );

returnCallback

如果你不能使用withConsecutive() ,可能是因为你使用旧版本的PHPUnit,你可以使用returnCallback另一个选项。

每次调用mock方法时都会调用returnCallback函数。 这意味着您可以保存传递给它的参数以供以后检查。 例如:

$actualArgs = array();

$mockDependency->expects($this->any())
    ->method('setOption')
    ->will($this->returnCallback(
        function($option, $value) use (&$actualArgs){
            $actualArgs[] = array($option, $value);
        }
    ));

$serviceUnderTest->executeMethodUnderTest();

$this->assertEquals(
    array(
        array('first arg of first call', 'second arg of first call'),
        array('first arg of second call', 'second arg of second call'),
    ),
    $actualArgs);

以前的答案是正确的。

您可以在PHPUnit手册中找到答案http://www.phpunit.de/manual/3.6/en/phpunit-book.html#test-doubles.mock-objects.tables.matchers搜索匹配器。 匹配器是函数any(),never()等返回的类...你需要的是PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex,由方法返回()

您可以通过浏览PHPUnit类找到更多(添加到项目路径并使用像netbeans这样的IDE跳转到它们并查看可以使用的内容)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM