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

Che*_*sea 7 integration-testing rspec ruby-on-rails request-headers 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
Run Code Online (Sandbox Code Playgroud)

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

page.set_headers("REMOTE_ADDR" => "1.2.3.4")
visit root_path
Run Code Online (Sandbox Code Playgroud)

这有效,但我想知道是否有更好的方法,只是能够在请求上设置自定义remote_ip/remote_addr似乎有点过分.有什么想法吗?

awe*_*ndt 1

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

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

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