Тестирование интеграции с помощью 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. Спасибо, что указали мне в правильном направлении.
Ответ 6
Я использую решение Cucumber и James вместе со следующим исправлением, работающим для меня:
https://webrat.lighthouseapp.com/projects/10503/tickets/383-reset_session-and-webrat-dont-play-nicely-with-one-another
Ответ 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.