在RSpec请求规范中使用Capybara时,设置自定义请求标头的最佳方法是什么?

我正在使用set_headers方法修补Capybara :: Session,该方法分配给Capybara :: RackTest :: Browser的选项属性(我已经从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似乎有点过分。 有什么想法吗?

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

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

请参阅rack_test_driver_spec.rb 1.1.2中的rack_test_driver_spec.rbrack_test_driver_spec.rb的问题#320, 设置HTTP标头 。

您是否需要使用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']") 

我希望它有所帮助。