PHPUnit: как имитировать множественные вызовы одного и того же метода

Я хотел получить разные возвращаемые значения для одного и того же метода, вызывая его несколько раз. Я много чего перепробовал, но точного ответа не получил.

$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));
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
2 763
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я нашел ссылку это, которая помогает мне сделать это с помощью метода 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));

Отличный трюк, если вы получаете ожидания в виде массива. Вы можете зациклить массив и повторить добавление каждого ожидания.

Xavi Montero 29.12.2019 13:06

@XaviMontero Я использовал здесь at, потому что метод многократно использовался в цикле, поэтому я хочу вернуть другой результат по индексу при вызове функции.

TIGER 30.12.2019 04:14

n.b. at() устарел в PHPUnit 9 и будет удален в версии 10.

Ben Y 26.08.2020 21:04
Ответ принят как подходящий

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

Keven 28.05.2021 01:00

Другие вопросы по теме