使用RSpec / webmock来存储各种状态代码的请求

时间:2016-05-19 15:05:03

标签: ruby rspec webmock

我需要使用webmock / webmock将请求存根到外部API,但我需要测试一些响应(200,404,503等)。干净利落的最佳方式是什么?我的第一个hacky想法是你可以在标题中设置一些独特的东西,比如一个唯一的用户代理字符串,以便键入,但它导致我编写如下可怕的代码:

# spec/spec_helper.rb
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'the_geek'
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)
RSpec.configure do |config|
  config.before(:each) do
    stub_request(:get, /www.boardgamegeek.com/).
      with(headers: {'Accept'=>'*/*', 'User-Agent'=>'SOME 200 STRING'}).
      to_return(status: 200, body: "stubbed response", headers: {})

    stub_request(:get, /www.boardgamegeek.com/).
      with(headers: {'Accept'=>'*/*', 'User-Agent'=>'SOME 404 STRING'}).
      to_return(status: 404, body: "Not Found", headers: {})

    stub_request(:get, /www.boardgamegeek.com/).
      with(headers: {'Accept'=>'*/*', 'User-Agent'=>'SOME 503 STRING'}).
      to_return(status: 503, body: "Not Found", headers: {})
  end
end

我看过录像机,但据我所知,用它来模拟和捕捉错误很难。是否有另一种干净简洁的方法来存根多个响应代码的请求?谢谢!

1 个答案:

答案 0 :(得分:2)

您用于发出HTTP请求的任何库都有一种返回响应状态的方法。我会使用RSpec stubs 来存根库以返回每个示例中所需的状态(以及有关响应的任何其他内容)。除了需要比webmock方法更少的代码之外,这还有一个优点,即您需要阅读以理解每个示例的所有内容都在示例中,而不是在spec_helper.rb中。

如果不清楚,请随意添加提出请求的代码到我的问题中,我可以举例说明如何将其存根。

我根本不担心需要返回错误状态的规范中的webmock;它仍然会阻止你发出HTTP请求,但你不会,因为你要将它们删除。