Подтвердить что ты не робот

В PHPUnit, как я могу указать разные() при последовательных вызовах издевающегося метода?

Я хочу дважды вызвать мой издеваемый метод с разными ожидаемыми аргументами. Это не работает, потому что expects($this->once()) выйдет из строя при втором вызове.

$mock->expects($this->once())
     ->method('foo')
     ->with('someValue');

$mock->expects($this->once())
     ->method('foo')
     ->with('anotherValue');

$mock->foo('someValue');
$mock->foo('anotherValue');

Я также пробовал:

$mock->expects($this->exactly(2))
     ->method('foo')
     ->with('someValue');

Но как добавить a с() для соответствия второму вызову?

4b9b3361

Ответ 1

Вам нужно использовать at():

$mock->expects($this->at(0))
     ->method('foo')
     ->with('someValue');

$mock->expects($this->at(1))
     ->method('foo')
     ->with('anotherValue');

$mock->foo('someValue');
$mock->foo('anotherValue');

Обратите внимание, что индексы, переданные в at(), применяются ко всем вызовам метода к одному и тому же макету. Если второй вызов метода был bar(), вы не изменили бы аргумент на at().

Ответ 2

Ссылка из ответа из аналогичного вопроса,

С PHPUnit 4.1 вы можете использовать withConsecutive например.

$mock->expects($this->exactly(2))
     ->method('set')
     ->withConsecutive(
         [$this->equalTo('foo'), $this->greaterThan(0)],
         [$this->equalTo('bar'), $this->greaterThan(0)]
       );

Если вы хотите, чтобы он возвращался по последовательным вызовам:

  $mock->method('set')
         ->withConsecutive([$argA1, $argA2], [$argB1], [$argC1, $argC2])
         ->willReturnOnConsecutiveCalls($retValueA, $retValueB, $retValueC);

Не рекомендуется использовать at(), если вы можете избежать этого, потому что как заявляют их документы

Параметр $index для атрибута at() относится к индексу, начиная с нуля, во всех вызовах метода для данного макета. Соблюдайте осторожность при использовании этого соединителя, так как это может привести к хрупким испытаниям, которые слишком тесно связаны с конкретными деталями реализации.