使用 RSpec/webmock 对各种状态码的请求存根

Using RSpec/webmock to stub requests for various status codes

我需要使用 webmock/webmock 存根对外部 API 的请求,但我需要测试少数响应(200、404、503 等)。干净地执行此操作的最佳方法是什么?我的第一个 hacky 想法是,您可以在 headers 中设置一些独特的东西,例如独特的 User-Agent 字符串,以键入但它导致我写出如下糟糕的代码:

# 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

我看过 VCR,但据我所知,很难用它来模拟和捕获错误。是否有另一种简洁明了的方法来消除对多个响应代码的请求?谢谢!

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

中。

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

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