Я хотел получить разные возвращаемые значения для одного и того же метода, вызывая его несколько раз. Я много чего перепробовал, но точного ответа не получил.
$mock = $this->getMockBuilder('Test')
->disableOriginalConstructor()
->setMethods(array('testMethod'))
->getMock();
$mock->expects($this->once())->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->second())->method('testMethod')->will($this->returnValue(false));






Я нашел ссылку это, которая помогает мне сделать это с помощью метода at($index). Он возвращает сопоставление, которое соответствует, когда метод, для которого он оценивается, вызывается в данном $index.
Параметр $index для сопоставителя at() относится к индексу, начиная с нуля, во всех вызовах методов для данного фиктивного объекта. Соблюдайте осторожность при использовании этого сопоставителя, поскольку это может привести к нестабильным тестам, которые слишком тесно связаны с конкретными деталями реализации. Подробнее
$mock = $this->getMockBuilder('Test')
->disableOriginalConstructor()
->setMethods(array('testMethod'))
->getMock();
$mock->expects($this->at(0))->method('testMethod')->will($this->returnValue(true));
$mock->expects($this->at(1))->method('testMethod')->will($this->returnValue(false));
@XaviMontero Я использовал здесь at, потому что метод многократно использовался в цикле, поэтому я хочу вернуть другой результат по индексу при вызове функции.
n.b. at() устарел в PHPUnit 9 и будет удален в версии 10.
Вы можете использовать метод willReturnOnConsecutiveCalls
$mock
->expects($this->exactly(2))
->method('testMethod')
->willReturnOnConsecutiveCalls(true, false);
Альтернатива (для phpunit <4):
$mock
->expects($this->exactly(2))
->method('testMethod')
->will($this->onConsecutiveCalls(true, false));
Проверяя исходный код, похоже, что willReturn() также может обрабатывать несколько аргументов, чтобы разрешить последовательные вызовы.
Отличный трюк, если вы получаете ожидания в виде массива. Вы можете зациклить массив и повторить добавление каждого ожидания.