【问题标题】:How can I block external connections with RSpec & Capybara?如何阻止与 RSpec 和 Capybara 的外部连接?
【发布时间】:2014-09-30 22:06:52
【问题描述】:

在我的 Rails 项目中,我想编写非理想条件下的测试,例如缺乏互联网连接或超时。例如,我正在使用 gem 联系 API,并希望确保在我的应用与外部 API 之间存在连接问题时正确处理错误。

我已经可以做到这一点,方法是用 VCR 制作一个固定装置并从“盒式磁带”中删除响应。但是,这也有缺点:

  • 必须手动完成。
  • 如果我与团队合作(我就是这样),则无法忽略磁带。

如何在我的 RSpec 测试中简单地创建一个阻止外部连接的块,模拟互联网连接的缺失?

【问题讨论】:

    标签: ruby-on-rails ruby testing rspec capybara


    【解决方案1】:

    根据这篇思想机器人文章

    https://robots.thoughtbot.com/how-to-stub-external-services-in-tests#disable-all-remote-connections

    # spec/spec_helper.rb
    require 'webmock/rspec'
    WebMock.disable_net_connect!(allow_localhost: true)
    

    【讨论】:

    • 哇,我非常喜欢!下次有机会我一定要试试。似乎这将是一种首选方法。
    • 然后您可以为发出的请求指定存根响应:stub_request(:get, "url.goes.here")。 to_return(status: 200, body: "some response", headers: {})
    • 这是一篇很棒的文章,但它只适用于 Net::HTTP.get(uri),但不适用于 Rspec 的 get(uri)
    【解决方案2】:

    我从未尝试过这样做,但也许您可以使用webmock 来存根所有请求。

    before do 
      stub_request(:any, /.*/).to_return(body: "errors", status: 422)
    end
    

    More info 用于存根外部服务。

    【讨论】:

    • 谢谢!这完美地工作。我唯一需要做的就是将 require 'webmock/rspec' 添加到 spec_helper.rb。
    • 这篇文章很棒,但如果我只想禁用互联网连接而不必添加像 webmock 这样大的 gem,该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多