Тестирование сессий в Rails 3 с Rspec & Capybara - PullRequest
8 голосов
/ 08 марта 2011

Я пытаюсь написать интеграционные тесты с помощью rspec, factory_girl & capybara. У меня также установлен огурец, но я им не пользуюсь (насколько мне известно).

Я в основном хочу предварительно заполнить базу данных моим пользователем, затем перейти на мою домашнюю страницу и попытаться войти в систему. Он должен перенаправить на user_path (@user).

Однако сеансы, похоже, не сохраняются в моих / rspec / запросы / интеграционных тестах.

Моя спецификация: /rspec/requests/users_spec.rb

require 'spec_helper'

describe "User flow" do

  before(:each) do
    @user = Factory(:user)
  end

  it "should login user" do

    visit("/index")

    fill_in :email, :with => @user.email
    fill_in :password, :with => @user.password
    click_button "Login"
    assert current_path == user_path(@user)
  end
end

Возвращает:

Failures:

  1) User flow should login user
     Failure/Error: assert current_path == user_path(@user)
     <false> is not true.
     # (eval):2:in `send'
     # (eval):2:in `assert'
     # ./spec/requests/users_spec.rb:16

Вместо этого он перенаправляет на мой please_login_path - что должно произойти, если по какой-либо причине произойдет сбой входа (или если сессия [: user_id] не установлена).

Если я попытаюсь поместить session.inspect, он потерпит неудачу как нулевой объект.

Если я попытаюсь сделать это в тестах контроллера (/rspec/controllers/sessions_spec.rb), я могу без проблем получить доступ к сеансу и вызвать сессию [: user_id]

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

Если вы используете Devise, вам нужно будет включить Warden :: Test :: Helpers (сразу после того, как требуется spec_helper), как указано в вики warden .

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

3 голосов
/ 04 декабря 2011

У меня те же проблемы, и, хотя для некоторых может быть полезно заполнить форму, мне пришлось свернуть свой собственный рубин аутентификации, потому что я использовал стороннюю систему аутентификации (Janrain, если быть точным) .... в моемтесты, которые я закончил, используя что-то вроде этого:

Вот что у меня есть в моей спецификации / support / test_helpers_and_stuff.rb

module AuthTestHelper

  class SessionBackdoorController < ::ApplicationController
    def create
      sign_in User.find(params[:user_id])
      head :ok
    end
  end

  begin
    _routes = Rails.application.routes
    _routes.disable_clear_and_finalize = true
    _routes.clear!
    Rails.application.routes_reloader.paths.each{ |path| load(path) }
    _routes.draw do
      # here you can add any route you want
      match "/test_login_backdoor", to: "session_backdoor#create"
    end
    ActiveSupport.on_load(:action_controller) { _routes.finalize! }
  ensure
    _routes.disable_clear_and_finalize = false
  end

  def request_signin_as(user)
    visit "/test_login_backdoor?user_id=#{user.id}"
  end

  def signin_as(user)
    session[:session_user] = user.id
  end

end

Затем в моей спецификации запроса с капибарой и селеном ясделал следующее:

describe "Giveaway Promotion" do
  context "Story: A fan participates in a giveaway", js: :selenium do
    context "as a signed in user" do

      before :each do
        @user = Factory(:user)
        request_signin_as @user
      end

      it "should be able to participate as an already signed in user" do
        visit giveaway_path
        ....
      end
    end
  end
end

Кстати, я нашел решения после того, как попробовал предложенные решения для этого поста и этого поста , и ни один из них не помог мне,(но они определенно вдохновили мое решение)

Удачи!

1 голос
/ 23 сентября 2011

Вы, вероятно, отошли от этого, но я просто боролся с тем же вопросом.Оказывается, это был вопрос синтаксиса.Я использовал символы для :email и :password, и вместо этого я должен был использовать строки ("email" и "password").

Другими словами, попробуйте изменить это:

fill_in :email, :with => @user.email
fill_in :password, :with => @user.password

на это:

fill_in "email", :with => @user.email
fill_in "password", :with => @user.password
...