23

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

4

2 回答 2

34

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

显然您可以将 更改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")

你去吧,毕竟不是太难。


我不知道我第一次怎么没有找到这个。无论如何,希望有一天这对某人有所帮助。

于 2014-08-28T22:58:46.960 回答
1

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

于 2018-11-10T20:06:33.523 回答