相关型号:
class User < ActiveRecord::Base
acts_as_authentic
end
class UserSession < Authlogic::Session::Base
end
的ApplicationController:
class ApplicationController < ActionController::Base
helper :all
protect_from_forgery
helper_method :current_user_session, :current_user
private
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
end
这是Rspec:
describe "Rate Function" do
include Authlogic::TestCase
before(:each) do
current_user = FactoryGirl.create(:user, persistence_token: "pt", email: "new@example.com", password: 'password', password_confirmation: 'password')
activate_authlogic
UserSession.create(current_user)
end
it "Some test for rating..." do
get "/reviews/rate", {:format => :json, :vehicle_id => 3}
# other stuff here, doesn't matter what it is because it never gets here
end
after(:each) do
end
end
这是用户的Rspec定义:
FactoryGirl.define do
factory :user do
email "email@example.com"
password "password"
password_confirmation "password"
persistence_token "pertoken"
end
end
问题在于每次我从任何控制器方法调用current_user
时,它总是返回nil
而这是因为UserSession.find
始终在nil
中返回ApplicationController
}。
有趣的是,如果我在Rspec中运行以下内容(不在控制器中),UserSession.find
正常工作且just_created_session
不是零。
UserSession.create(current_user)
just_created_session = UserSession.find
因此问题特定于在控制器中调用UserSession.find
。
感谢任何帮助。
环境
Ruby: 1.9.3p392
Rails: 3.2.12
Authlogic: 3.2.0
Factory Girl: 4.2.0
Rspec: 2.13.0
OS: Windows 7
更新:我查看了UserSession.create
,它所做的就是:
def create(*args, &block)
session = new(*args)
session.save(&block)
session
end
由于我甚至没有在从规范调用时存储返回值,该方法似乎也没有进行任何存储,我不确定我们如何期望User.find
找到任何东西。
答案 0 :(得分:0)
我偶然发现了一个类似的问题,UserSession.find在从RSpec请求规范驱动时在控制器中返回nil。
在RSpec测试之间运行数据库清理程序导致authlogic的UserSession.find(有时)返回nil,即使会话有效。我会UserSession.create(模型),立即,UserSession.find将返回nil。但只能从请求规格。这令人沮丧。
然而,这不是authlogic的错。我在模型类中发现了一个memoization,它在数据库清理中幸存下来。这保持了对活动记录对象的幻像引用,并且此引用意外地传递给UserSession.create,导致了该症状。会话已创建,并且立即不可用,但仅在数据库清理程序运行时才会生成。