Ответ 1
Только что нашел rack_session_access gem и работал как прелесть.
Я разрабатываю приложение для Shopify и хочу выполнить интеграционное тестирование.
Мне нужно иметь возможность хранить некоторые значения в переменной сеанса, чтобы работа выполнялась.
Как я могу это сделать?
Я использую Capybara и Capybara-webkit.
Только что нашел rack_session_access gem и работал как прелесть.
Принятый ответ предлагает rack_session_access. Он работает, вставляя контроллеры промежуточного программного обеспечения для редактирования и обновления состояния сеанса, после чего capybara посещает эту страницу и передает форму с данными сеанса. Очень изобретательно! Но не нужно, если вы используете Warden (непосредственно или через Devise).
У Warden есть крючок on_next_request, который дает доступ к механизму наблюдения, который может использоваться для непосредственного набора ключей сеанса. Я бросил это вместе, чтобы связать его в 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
Как говорится в комментарии от apneadiving, вы должны заполнить форму "непосредственно" с помощью capybara. Тестирование с использованием Cucumber может выглядеть так, чтобы заполнить форму для входа для аутентификации (с Capybara github page):
When /I sign in/ do
within("#session") do
fill_in 'Login', :with => '[email protected]'
fill_in 'Password', :with => 'password'
end
click_link 'Sign in'
...
end
Если вы пытаетесь сделать что-то другое или возникают проблемы с обычным процессом входа в систему, this, вопрос SO может помочь.
Я боюсь, что приношу плохие новости, но из документации Capybara:
Доступ к сеансу и запросу невозможно из теста, доступ к ответ ограничен.
Таким образом, вы не сможете проверить, как вы ожидаете.
Просто подумайте: было бы приемлемо, чтобы вы вставляли какую-то условную инструкцию в свой контроллер для целей тестирования.:
session[:foo] = User.first.id if Rails.env.test?
Лучшим вариантом было бы обезглавить ваш контроллер только для ваших тестов интеграции.
Вы можете использовать что-то вроде видеомагнитофона или webmock, чтобы отключить вызов внешнего ресурса http.