Каков наилучший способ установки пользовательских заголовков запросов при использовании Capybara в спецификациях запросов RSpec? - PullRequest
6 голосов
/ 15 августа 2011

Я обезьяна исправляю Capybara :: Session с помощью метода set_headers, который присваивает атрибуту параметров 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 по запросу. Есть мысли?

Ответы [ 3 ]

1 голос
/ 19 февраля 2013

Вам нужно добавить пользовательский заголовок в один конкретный запрос в rspec, используя capybara? Я использовал это в приемочных испытаниях. Для меня это был лучший способ использовать метод 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']")

Надеюсь, это поможет.

1 голос
/ 24 февраля 2019

Я обнаружил возможность изменять заголовки при использовании драйвера 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

Протестировано с :

  • capybara: 3.13.2 (драйвер RackTest)
  • rspec: 3.8
  • rails: 5.2.2

PS Еще не тестировал его с драйвером селена. Но, вероятно, он работает аналогичным образом.

1 голос
/ 24 марта 2012

Если вы хотите, чтобы заголовки были глобально установлены для всех запросов, вы можете использовать что-то вроде:

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

См. rack_test_driver_spec.rb в Capybara 1.1.2 и выпуске Capybara # 320, Настройка заголовков HTTP .

...