phpunit: переопределение поведения макета после начальной настройки - PullRequest
0 голосов
/ 08 мая 2018

Я создаю набор модульных тестов для клиента, который использует транспортный уровень HTTP для связи с сервером. Поскольку меня интересует поведение клиента, я высмеиваю экземпляр транспортного уровня HTTP, который он использует. Поскольку настройка макетов в PHPUnit является проблемой, я определил несколько вспомогательных функций в классе теста, чтобы избавить меня от необходимости настраивать макеты для каждого теста.

<?php
private function mockTransport()
{
    $mock = $this->getMock(HTTPClient::class);
    $mock->expects($this->any)
        ->method("send")
        ->will($this->returnValue($this->mockHTTPResponse));
    return $mock
}

private function mockHTTPResponse()
{
    $mock = $this->getMock(ResponseInterface::class);
    $mock->expects($this->any)
        ->method("getStatus")
        ->will($this->returnValue(200)); // HTTP 200 OK

    return $mock;
}

Это нормально для большинства вещей, за исключением случаев, когда я приступаю к тестированию, когда код отличается от 200. Я намеревался манипулировать имитаторами, возвращенными вышеуказанными вспомогательными методами, но я обнаружил, что даже если я переопределил метод снова, он все еще возвращает тот же ответ!

    $mock = $this->getMock(ResponseInterface::class);
    $mock->expects($this->any)
        ->method("getStatus")
        ->will($this->returnValue(200)); // HTTP 200 OK
    var_dump ($mock->getStatus()); // 200
    $mock->expects($this->any)
        ->method("getStatus")
        ->will($this->returnValue(400)); // HTTP 400 bad request
    var_dump ($mock->getStatus()); // Still 200!

Это означает, что если мне нужно что-то отличное от ответа 200, я должен либо: а) построить всю макетную структуру с нуля (сильная боль в шее, которую в первую очередь должны были избежать вспомогательные функции), либо б) передать аргумент кода состояния в mockResponse () (что мне кажется неправильным, так как тесты должны быть глупыми).

Можно ли сбросить ответы, которые макет даст на данный вызов метода после его первоначальной настройки? Если да, то как?

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