我正在使用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似乎有点矫枉过正。有什么想法吗?
答案 0 :(得分:1)
如果您希望在所有请求上全局设置标头,可以使用以下内容:
Capybara.register_driver :custom_headers_driver do |app|
Capybara::RackTest::Driver.new(app, :headers => {'HTTP_FOO' => 'foobar'})
end
请参阅Capybara 1.1.2中的rack_test_driver_spec.rb
和Capybara的问题#320,Setting up HTTP headers。
答案 1 :(得分: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']")
我希望它有所帮助。
答案 2 :(得分:1)
我发现使用默认的Capybara::RackTest
驱动程序时可以修改标头。
有一种方法Capybara::RackTest::Browser#process
在发送定稿之前准备一个请求(https://www.rubydoc.info/gems/capybara/Capybara%2FRackTest%2FBrowser:process)。正如您在代码中看到的那样,请求标头是根据options[:headers]
构建的。 options
实际上是指driver.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
经过测试:
P.S。尚未使用硒驱动程序对其进行测试。但是它可能以类似的方式工作。