Тестирование интеграции с помощью Authlogic?

В течение жизни я не понимаю, почему Authlogic не регистрирует меня в этом тесте интеграции. У меня не было никаких проблем с Authlogic, регистрирующим меня в функциональных тестах с использованием этого кода. Согласно authlogic rdocs (http://tinyurl.com/mb2fp2), имитация состояния входа в систему одинакова в функциональных и интеграционных тестах, поэтому я довольно смущенный. любая помощь МНОГО оценивается!

class TipsController < ApplicationController
  before_filter :require_user,  :only => [:destroy, :undelete]
  def destroy
    @tip = Tip.find(params[:id])

    if can_delete?(@tip)

      @tip.destroy

      set_flash("good", "Tip deleted. <a href=\"#{undelete_tip_url(@tip.id)}\">Undo?</a>")
      respond_to do |format|
        format.html { redirect_to city_path(@tip.city)} 
      end
    else
      set_flash("bad", "Seems like you can't delete this tip, sorry.")
      respond_to do |format|
        format.html { render :action => "show", :id => @tip} 
      end
    end
  end
end


class DeleteTipAndRender < ActionController::IntegrationTest
  context "log user in" do
    setup do
      @user = create_user
      @tip = create_tip
    end

    context "delete tip" do
      setup do
        activate_authlogic
        UserSession.create(@user)
        @us = UserSession.find
        post "/tips/destroy", :id => @tip.id
      end

      should_redirect_to("city_path(@tip.city)"){city_path(@tip.city)} 
    end
  end
end

Ответ 1

На основе кода в методе user_sessions_controller create, который принимает хэш учетных данных для входа в систему, я смог заставить его работать следующим образом в моем тесте интеграции:

UserSession.create(:email => '[email protected]', :password => 'password')

но не с:

UserSession.create(@user)

Ответ 2

Я также использую Authlogic с Shoulda (но с factory_girl сверху).

Мои функциональные тесты выглядят следующим образом:

require 'test_helper'

class LoansControllerTest < ActionController::TestCase
[...]

  context "as a signed-in user, with an active loan" do
    setup do
      @user = Factory(:user)
      @user_session = UserSession.create(@user)
      @loan = Factory(:loan, :ownership => Factory(:ownership, :user => @user))
    end

    context "on GET to :index" do
      setup do
        get :index
      end

      should_respond_with_success
    end
  end
end

На самом деле вы можете передать действительного пользователя пользователю UserSession, также в rdoc. Вы также должны избегать вызова activ_authlogic в каждом тесте контроллера:

ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'

class ActiveSupport::TestCase
  [...]
  # Add more helper methods to be used by all tests here...
  include Authlogic::TestCase

  def setup
    activate_authlogic
  end
end

Ответ 3

Я обнаружил, что для тестов интеграции мне нужно войти через сообщение:

setup do
  post 'user_session', :user_session => {:email => '[email protected]', :password => 'password'}
end

Это правильно устанавливает сеанс, а упомянутый выше метод работает только для меня в функциональных тестах.

Ответ 4

Да, я нашел на этой неделе, что с rspec: в функциональных спецификациях вы моделируете вход в систему только в порядке w/ UserSession.create(@user). Но если вы попробуете это в спецификации интеграции, это не сработает. Чтобы войти в систему из спецификаций интеграции, я обнаружил, что мне нужно управлять формами (с webrat), что явно будет проблемой для таких вещей, как Facebook и OpenID.

Ответ 5

Я не мог заставить его работать с принятым ответом, но был близок. Мне пришлось добавить восклицательный знак в конец функции:

UserSession.create!(@user)

Работает с Ruby v3.2.18 и Authlogic v3.4.2. Спасибо, что указали мне в правильном направлении.

Ответ 7

Для людей, которые находят это сообщение в Google и Greater Justice, вам нужно установить атрибут persitence_token в модели пользователя. Например. вы можете вызвать @user.reset_persistence_token!, и все начнет работать.:)

Ответ 8

У меня была такая же проблема, и я мог ее исправить, выполнив вход вручную (как уже ответили другие)

Кроме того, мне пришлось исправить мой домен cookie:

Rails использует www.example.com для своих тестов, и поскольку я установил для домена cookie другое значение в моем application.rb (через config.cookie_domain), cookie сеанса, созданный после входа в систему, не был доступен из последующих запросов.

После установки правильного домена cookie все снова работало.

Ответ 9

Посмотрите rdoc.