单元测试:使用Guzzle 5模拟超时

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();
    }
}

更新:

正确的问题是:如何在Guzzle 5中抛出异常?或者,如何测试使用Guzzle 5的catch块?


如果你知道服务器的执行超时时间,为什么不尝试引入php sleep或usleep来强制等待一个操作完成的时间? - Adam T
超时时间在创建的 httpClient 中设置,以及连接服务器。我认为当我有 httpClient 的模拟(Guzzle)时,创建/模拟一个服务器不是一个好主意。只需了解如何使用此模拟抛出异常即可。 - Victor Aguilar
好的,明白了。很抱歉我在这里无法提供更多帮助。 - Adam T
1个回答

6
您可以通过 GuzzleHttp\Subscriber\Mock 对象中的 addException 方法,在 catch 块内测试代码。
以下是完整的测试:
/**
 * @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');
}

在单元测试中,我将 GuzzleHttp\Exception\ConnectException 添加到模拟对象中。然后,我将模拟对象添加到发射器中,最后调用我想要测试的方法 request
参考资料: 源代码 Mockito 测试一个无返回值方法抛出异常

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接