PHPUnit:如何模拟具有多个参数的多个方法调用?

2022-08-30 09:01:03

我正在为使用PHPUnit的方法编写单元测试。我正在测试的方法对同一对象上的相同方法进行3次调用,但具有不同的参数集。我的问题类似于这里这里提出的问题

其他帖子中提出的问题与只接受一个论点的模拟方法有关。

但是,我的方法需要多个参数,我需要这样的东西:

$mock->expects($this->exactly(3))
->method('MyMockedMethod')
    ->with(
        $this->logicalOr(
            $this->equalTo($arg1, $arg2, arg3....argNb),
            $this->equalTo($arg1b, $arg2b, arg3b....argNb),
            $this->equalTo($arg1c, $arg2c, arg3c....argNc)
        )
    );

此代码不起作用,因为仅验证一个参数。给它一个以上的参数会引发一个异常:equalTo()

PHPUnit_Framework_Constraint_IsEqual::__construct() 的参数 #2 必须是数字

有没有办法对具有多个参数的方法进行嘲笑?logicalOr

提前致谢。


答案 1

在我的情况下,答案很简单:

$this->expects($this->at(0))
    ->method('write')
    ->with(/* first set of params */);

$this->expects($this->at(1))
    ->method('write')
    ->with(/* second set of params */);

关键是使用 ,作为该方法的第 N 次调用。我无法对我尝试过的任何变体做任何事情。$this->at(n)nlogicalOr()


答案 2

对于希望同时匹配输入参数并为多个调用提供返回值的其他人。这对我有用:

    $mock->method('myMockedMethod')
         ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
         ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);

推荐