В 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 с() для соответствия второму вызову?
Ответы
Ответ 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() относится к индексу, начиная с нуля, во всех вызовах метода для данного макета. Соблюдайте осторожность при использовании этого соединителя, так как это может привести к хрупким испытаниям, которые слишком тесно связаны с конкретными деталями реализации.