【问题标题】:Rails 4: stubbing in a Capybara & Poltergeist integration testRails 4:在 Capybara 和 Poltergeist 集成测试中存根
【发布时间】:2018-02-16 21:33:44
【问题描述】:

我在 Rails 4 应用程序中使用 Capybara 和 Poltergeist 测试一个相当简单的规范时遇到了麻烦。

规范如下所示:

feature 'Creating user groups', :devise, js: true do
  let(:panel) { create(:panel) }
  let(:admin) { create(:user, :admin) }

  before do
    login_as(admin)
    visit admin_panel_user_groups_path(panel)
    click_link 'New user group'
  end

  context 'successfully' do
    it 'admin can create a new user group' do
      fill_in 'User group', with: 'Some group'
      click_button 'Save'

      expect(page).to have_content('Your user group has been saved correctly')
    end
  end
end

规范最终调用了这个 create 方法,该方法返回一个带有 format.js 的 json 响应(这就是我使用 js: true 运行上述规范的原因):

class Admin::UserGroupsController < AdminController
  respond_to :html, :json, :js, :csv
  before_action :set_panel

  def create
    respond_to do |format|
      @user_group = UserGroup.new(user_group_params.merge({panel_id: @panel.id}))
      if @user_group.save
        @user_group.refresh!
        format.js do
          render json: {
            responseType: 'modelSaved',
            object: @user_group
          }.to_json, status: 200
        end
      else
        format.js do
          render json: {
            responseType: 'error',
            object: @user_group
          }.to_json, status: 500
        end
      end
    end
  end
end

我已经在我的rails_helper.rb fie 中设置了 Poltergeist:

require 'capybara/poltergeist'

RSpec.configure do |config|
  config.include Warden::Test::Helpers, type: :feature
  config.after(type: :feature) { Warden.test_reset! }
  Capybara.javascript_driver = :poltergeist
end

但我在运行规范时收到以下错误消息:

Failure/Error: visit admin_panel_user_groups_path(panel)
WebMock::NetConnectNotAllowedError:
Real HTTP connections are disabled. Unregistered request: GET http://127.0.0.1:54553/__identify__ with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

You can stub this request with the following snippet:

stub_request(:get, "http://127.0.0.1:54553/__identify__").
with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
to_return(:status => 200, :body => "", :headers => {})

registered request stubs:

stub_request(:get, "/http:\/\/maps.googleapis.com\/maps\/api\/geocode\/json?components=country:US|postal_code:\d+/")
stub_request(:get, "https://freegeoip.net/json/123.123.123.123").
with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'})

我相信这是因为规范中不允许外部连接(这很好)。但是,在集成测试中存根外部请求是否有意义?我是错误地配置了 Poltergeist 还是错误地考虑了这个测试?

提前致谢!

【问题讨论】:

    标签: ruby-on-rails capybara poltergeist


    【解决方案1】:

    你真的不应该在运行特性测试时启用 WebMock(它不能存根或阻止你正在使用的“浏览器”发出的请求,PhantomJS,所以它并不能真正保护你免受传出连接的影响)。因此,您要么需要在运行功能测试时允许连接

    WebMock.allow_net_connect!
    

    或者至少允许连接到在这种情况下运行在 127.0.0.1 上的 AUT

    WebMock.disable_net_connect!(allow_localhost: true)
    

    【讨论】:

    • 感谢您的回复。我正在使用规范尝试WebMock.disable_net_connect!(allow_localhost: true),但它在同一行(即visit admin_panel_user_groups_path(panel))上失败并出现另一个错误:Capybara::Poltergeist::StatusFailError: Request to 'http://127.0.0.1:58164/en/admin/panels/p1/user_groups' failed to reach server, check DNS and/or server status - Timed out with no open resource requests。我在sign_in 页面上有一个 reCaptcha,但这应该在测试中禁用。我还使用地理编码器 gem 进行了地理位置检查,但如果用户是管理员,则应该绕过它。
    • @DaniG2k 这是一个不同的问题/问题,但它可能会在您的应用程序编译资产时超时。您应该能够通过查看您的 test.log 并查看已提出哪些请求以及他们需要多长时间来响应来查看是否是这种情况。您可以尝试增加驱动程序注册的超时时间 - github.com/teampoltergeist/poltergeist#customization - 或通过在测试环境中预编译资产。
    • 谢谢,增加超时和允许本地主机连接的组合似乎已经成功了。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多