Подтвердить что ты не робот

Как настроить значение сеанса в Capybara?

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

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

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

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

4b9b3361

Ответ 1

Только что нашел rack_session_access gem и работал как прелесть.

Ответ 2

Принятый ответ предлагает 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

Ответ 3

Как говорится в комментарии от 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 может помочь.

Ответ 4

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

Доступ к сеансу и запросу невозможно из теста, доступ к ответ ограничен.

Таким образом, вы не сможете проверить, как вы ожидаете.


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

 session[:foo] = User.first.id if Rails.env.test?

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

Ответ 5

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