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

时间:2014-08-28 15:09:53

标签: ruby rspec webmock

我正在尝试使用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等等,但我如何测试超时服务器未找到/离线服务器没有互联网连接

2 个答案:

答案 0 :(得分:21)

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

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

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

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

提高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")

你去了,毕竟不是太难。


我不知道我第一次没有找到这个。无论如何,希望有一天能帮助别人。

答案 1 :(得分:0)

解决这个问题,并决定添加支持材料。根据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