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