Unit test: Имитировать тайм-аут с помощью Guzzle 5

Я использую Guzzle 5.3 и хочу проверить, что мой клиент выбрал TimeOutException.

Затем, как я могу сделать макет клиента Guzzle, который бросает GuzzleHttp\Exception\ConnectException?

Код для проверки.

public function request($namedRoute, $data = [])
{
 try {
 /** @noinspection PhpVoidFunctionResultUsedInspection */
 /** @var \GuzzleHttp\Message\ResponseInterface $response */
 $response = $this->httpClient->post($path, ['body' => $requestData]);
 } catch (ConnectException $e) {
 throw new \Vendor\Client\TimeOutException();
 }
}

Update:

Правильный вопрос: как бросить исключение с помощью Guzzle 5? или, как проверить блок catch с помощью Guzzle 5?

1 ответ

Вы можете проверить код внутри блока catch с помощью метода addException в объекте GuzzleHttp\Subscriber\Mock.

Это полный тест:

/**
 * @expectedException \Vendor\Client\Exceptions\TimeOutException
 */
public function testTimeOut()
{
 $mock = new \GuzzleHttp\Subscriber\Mock();
 $mock->addException(
 new \GuzzleHttp\Exception\ConnectException(
 'Time Out',
 new \GuzzleHttp\Message\Request('post', '/')
 )
 );
 $this->httpClient
 ->getEmitter()
 ->attach($mock);
 $this->client = new Client($this->config, $this->routing, $this->httpClient);
 $this->client->request('any_route');
}

В unit test я добавляю GuzzleHttp\Exception\ConnectException к макету. После этого я добавляю макет к эмиттеру и, наконец, я вызываю метод, который я хочу проверить, request.

Ссылка:

Исходный код

Mockito test метод void генерирует исключение

licensed under cc by-sa 3.0 with attribution.