1

我需要使用 webmock/webmock 对外部 API 的请求存根,但我需要测试少数响应(200、404、503 等)。干净地做到这一点的最佳方法是什么?我的第一个 hacky 想法是你可以在标题中设置一些独特的东西,比如一个唯一的 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,但据我了解,很难用它来模拟和捕获错误。是否有另一种简洁明了的方法来消除对多个响应代码的请求?谢谢!

4

1 回答 1

2

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

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

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

于 2016-05-19T15:38:14.287 回答