相关型号:

class User < ActiveRecord::Base
    acts_as_authentic
end

class UserSession < Authlogic::Session::Base
end

应用程序控制器:
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: "[email protected]", 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 protected]"
        password "password"
        password_confirmation "password"
        persistence_token "pertoken"
    end
end

问题是,每当我从任何控制器方法调用current_user时,它总是返回nil,这是因为UserSession.find总是在nil中返回ApplicationController
有趣的是,如果我在Rspec(不在控制器中)中运行以下命令,UserSession.find工作正常,just_created_session不是nil。
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如何找到任何内容。

最佳答案

我在UserSession中偶然发现了一个类似的问题。从RSpec请求规范驱动时,在控制器中查找返回nil。
在RSpec测试之间运行数据库清理程序导致authlogic的UserSession.find(有时)返回nil,即使会话是有效的我将UserSession.create(model),然后立即,UserSession.find将返回nil但只能从请求规范这真令人沮丧。
但是,这不是authlogic的错我在模型类中发现了一个在数据库清理过程中幸存下来的备忘录这维护了对活动记录对象的虚引用,而此引用意外传递给UserSession.create,导致了此症状会话已创建,并且立即不可修复,但仅在运行数据库清理程序时。

关于ruby-on-rails - Authlogic/Rspec/Rails 3.2:UserSession.find在ApplicationController中返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15316557/

10-10 01:36