我正试图使用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