【问题标题】:WebMock simulate failing API (no internet, timeout ++)WebMock 模拟失败的 API(没有互联网,超时 ++)
【发布时间】:2014-08-28 15:09:52
【问题描述】:

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

【问题讨论】:

    标签: ruby rspec webmock


    【解决方案1】:

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

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

    你去吧,毕竟不是太难。


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

    【讨论】:

    • 这确实有帮助,我很遗憾没有早点找到to_raiseto_timeout。谢谢!
    • 奇怪,如果我使用to_timeout,我无法避免RestClient::RequestTimeout 被抛出并且我的测试错误。如果我以任何方式使用to_raise,我会得到SystemStackError: stack level too deep
    • 老实说,听起来你的代码中存在错误:/
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2016-01-09
      • 2011-06-21
      • 2019-01-27
      • 1970-01-01
      • 2020-12-05
      • 2018-12-31
      • 1970-01-01
      相关资源
      最近更新 更多