WebMock模拟失败的API(无互联网,超时++)



我正试图使用webmock模拟来自web api的意外行为,例如找不到服务器和超时。

最好的方法是什么?我所能想到的就是做这样的事情:

stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
to_return(:status => [500, "Internal Server Error"])

这应该适用于404等情况,但我如何测试超时、未找到服务器/离线服务器没有互联网连接

经过一番挖掘,我找到了一些解决方案。

显然,您可以将to_return(...)更改为to_timeout,这将引发超时错误。您也可以使用to_raise(StandardError)。有关完整参考,请参阅https://github.com/bblimke/webmock#raising-超时错误。

超时,或找不到服务器,例如:

stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
to_timeout

Raise StandardError,或无互联网/其他异常,例如:

stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
to_raise(StandardError)
#Error example 2:
stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
to_raise("My special error")

给你,不要太用力。


我不知道我第一次怎么没发现这个。不管怎样,希望这有一天能帮助到别人。

遇到这个问题,决定添加支持材料。根据WebMock问题的讨论(https://github.com/bblimke/webmock/issues/16),可以通过两种方式模拟超时。

第一种方法有两种用途。to_raise(e)

stubbed_request = stub_request(:get, "#{host}/api/something.json").
with(:headers => {'Accept'=>'*/*', 'Content-Type'=>'application/json', 'User- 
Agent'=>'Ruby'}).to_raise(e)

其中e是库特定的超时异常。引用:"WebMock的全部目的是独立于HTTP客户端库,所以to_timeout应该适用于每个库。问题是不同的库返回不同的错误,即Net::HTTP返回Ruby Timeout::Error,而HTTPClient引发HTTPClient::TimeoutError。这种行为可以在WebMock中复制,但每次更改库时,错误处理代码都必须不同。"

第二种方法是使用以下示例:

stub_request(:any, 'www.example.net').to_timeout
RestClient.post('www.example.net', 'abc')    # ===> RestClient::RequestTimeout  

以下是原始来源:https://github.com/bblimke/webmock/issues/16

相关内容

  • 没有找到相关文章

最新更新