Как настроить значение сеанса в Капибаре? - PullRequest
28 голосов
/ 17 декабря 2011

Я занимаюсь разработкой приложения для Shopify и хочу провести интеграционное тестирование.

Мне нужно иметь возможность хранить некоторые значения в переменной сеанса, чтобы аутентификация работала.

Как я мог это сделать?

Я использую Capybara и Capybara-webkit.

Ответы [ 5 ]

27 голосов
/ 24 февраля 2013

Принятый ответ предполагает rack_session_access .Он работает, вставляя контроллеры промежуточного программного обеспечения для редактирования и обновления состояния сеанса, а затем заставляет капибару посещать эту страницу и отправлять форму с данными сеанса.Очень гениально!Но не нужно, если вы используете Warden (напрямую или через Devise).

Warden имеет хук on_next_request , который дает доступ к механизму warden, который можно использовать для непосредственной установки ключей сеанса.Я собрал это вместе, чтобы связать его в rspec:

Создать spec/support/inject_session.rb:

module InjectSession
  include Warden::Test::Helpers

  def inject_session(hash)
    Warden.on_next_request do |proxy|
      hash.each do |key, value|
        proxy.raw_session[key] = value
      end
    end
  end
end

В spec/spec_helper.rb включить модуль в спецификации функций:

RSpec.configure do |config|
    config.include InjectSession, :type => :feature
end

Тогда пример использования в спецификации может быть:

   inject_session :magic => 'pixie dust', :color => 'pink' 
   visit shopping_cart_path
   page.should be_all_sparkly_and_pink # or whatever
22 голосов
/ 08 ноября 2012

Только что найдено rack_session_access самоцвет и работает как заклинание.

4 голосов
/ 18 декабря 2011

Боюсь, что принесу плохие новости, но из документации Capybara:

Доступ к сеансу и запросу из теста невозможен, Доступ к ответу ограничен.* Таким образом, вы не сможете выполнять тестирование так, как ожидаете.


Просто подумайте: было бы приемлемо, если бы вы вставили какое-то условное выражение в контроллер для целей тестирования.

Лучшим вариантом было бы обезопасить ваш контроллер только для интеграционных тестов.

4 голосов
/ 08 апреля 2012

Вы можете использовать что-то вроде видеомагнитофона или веб-макета, чтобы отключить вызов от внешнего http-ресурса.

4 голосов
/ 17 декабря 2011

Как рекомендует комментарий от apneadiving, вы должны заполнить форму «напрямую», используя капибару. Тестирование с использованием Cucumber может выглядеть следующим образом для заполнения формы входа для аутентификации (со страницы Capybara github):

When /I sign in/ do
  within("#session") do
    fill_in 'Login', :with => 'user@example.com'
    fill_in 'Password', :with => 'password'
  end
  click_link 'Sign in'
  ...
end

Если вы пытаетесь сделать что-то другое или у вас возникают проблемы с обычным процессом входа в систему, этот ТАК вопрос может помочь.

...