7

我正在使用 set_headers 方法修补 Capybara::Session,该方法分配给 Capybara::RackTest::Browser 的 options 属性(我已将其从 attr_reader 更改为 attr_accessor)。

补丁:

class Capybara::RackTest::Browser
  attr_accessor :options
end

class Capybara::Session
  def set_headers(headers)
    if driver.browser.respond_to?(:options=) #because we've monkey patched it above
      options = driver.browser.options
      if options.nil? || options[:headers].nil?
        options ||= {}
        options[:headers] = headers
      else
        options[:headers].merge!(headers)
      end
    else
      raise Capybara::NotSupportedByDriverError
    end
  end
end

在我的请求规范中,我正在做:

page.set_headers("REMOTE_ADDR" => "1.2.3.4")
visit root_path

这可行,但我想知道是否有更好的方法,仅能够在请求上设置自定义 remote_ip/remote_addr 似乎有点矫枉过正。有什么想法吗?

4

3 回答 3

1

如果您希望在所有请求上全局设置标头,您可以使用以下内容:

Capybara.register_driver :custom_headers_driver do |app|
  Capybara::RackTest::Driver.new(app, :headers => {'HTTP_FOO' => 'foobar'})
end

请参阅rack_test_driver_spec.rbCapybara 1.1.2 和 Capybara 的问题 #320,设置 HTTP 标头

于 2012-03-24T12:32:24.417 回答
1

您是否需要使用 capybara 将自定义标头添加到 rspec 中的一个特定请求中?我在验收测试中使用了它。这是我对特定标题数据使用 get 方法的最佳方式。您可以评估响应页面上的特定元素。请参阅下面的示例:

get user_registration_path, { :invite => invite_token }, { 'X_GEOIP_COUNTRY_CODE' => 'US' } 
expect(assigns(:ip_country)).to eq('US')
response.body.should have_selector("input#currency_usd[checked='checked']")

我希望它有所帮助。

于 2013-02-19T11:52:52.097 回答
1

我发现使用默认Capybara::RackTest驱动程序时可以修改标头。

有一种方法Capybara::RackTest::Browser#process可以在最终发送之前准备请求(https://www.rubydoc.info/gems/capybara/Capybara%2FRackTest%2FBrowser:process)。正如您在代码中看到的那样,请求标头是从options[:headers]. 实际上是optionsdriver.options属性。因此,您可以通过修改此哈希来设置任何标头。

这是我的带有自定义标头的功能规范的示例


let(:headers) do
  {
    "YOUR_CUSTOM_HEADER_1" => "foo",
    "YOUR_CUSTOM_HEADER_2" => "bar",
    ...
  }
end 

before(:each) do
  @origin_headers = page.driver.options[:headers]
  page.driver.options[:headers] ||= {}
  page.driver.options[:headers].merge!(headers)
end

after(:each) do
  page.driver.options[:headers] = @origin_headers
end

经测试

  • 水豚:3.13.2(RackTest 驱动程序)
  • rspec:3.8
  • 导轨:5.2.2

PS尚未使用硒驱动程序对其进行测试。但可能它以类似的方式工作。

于 2019-02-24T00:45:15.877 回答