7

Capybara::RackTest::Browser の options 属性 (attr_reader から attr_accessor に変更しました) に割り当てる set_headers メソッドを使用して、Capybara::Session にモンキー パッチを適用しています。

パッチ:

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、Setting up HTTP headersを参照してください。

于 2012-03-24T12:32:24.417 に答える
1

カピバラを使用して、rspec の 1 つの特定のリクエストにカスタム ヘッダーを追加する必要がありますか? これを受け入れテストで使用しました。特定のヘッダー データで 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 に答える