В PHPUnit, как я могу указать различные с () при последовательных вызовах для смоделированного метода? - PullRequest
44 голосов
/ 30 апреля 2011

Я хочу вызвать мой смоделированный метод дважды с разными ожидаемыми аргументами.Это не работает, потому что 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');

Но как мне добавить с (), чтобы соответствоватьвторой звонок?

Ответы [ 2 ]

60 голосов
/ 30 апреля 2011

Вам нужно использовать 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().

19 голосов
/ 18 августа 2017

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

Начиная с 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 () относится к индексу, начиная с нуля, во всех вызовах методов для данного фиктивного объекта. Будьте осторожны при использовании этого сопоставителя, так как это может привести к хрупким испытаниям, которые слишком тесно связаны с конкретными деталями реализации.

...