使用Rails 4,我在获取Authlogic来查看伪造的UserSession时遇到了问题。
我已经设置了pages#whoami来呈现当前用户的电子邮件地址,以简化测试。
class PagesController < ApplicationController
# before_filter :require_user
def whoami
render :text => current_user.try(:email) || 'anonymous'
end
end
在spec/spec_helper.rb中:
require "authlogic/test_case"
include Authlogic::TestCase
和我的rspec测试:
require 'spec_helper'
describe '/whoami' do
setup :activate_authlogic
it "should tell me who I am" do
user = FactoryGirl.create(:user)
user.should be_valid
session = UserSession.create(user)
session.should be_valid
get '/whoami'
response.body.should == user.email
end
end
我更新了应用程序 Controller 以显示当前 session :
def require_user
unless current_user
raise "Current User Session is: #{ current_user_session.inspect}"
store_location
flash[:notice] = "You must be logged in to access this page"
redirect_to new_user_session_url
return false
end
end
在对before_filter:require_user进行注释的情况下,我正确地获得了“匿名”身份。取消注释时,我看到我的用户 session 为nil。我尝试浏览authlogic代码,但在Authlogic::Session:Persistence::InstanceMethods#persisting中迷路了?
我正在尝试调试。这是我到目前为止的位置。
在这里,我们尝试将Authlogic::Session::Base.controller设置为测试的模拟 Controller :
https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/test_case.rb#L109
在我的规范中,我看到@controller是Authlogic::TestCase::MockController
在我的规范中,我看到Authlogic::Session::Base.controller设置为该模拟 Controller 。
但是,我然后检查此:
class ApplicationController < ActionController::Base
...
def current_user_session
raise Authlogic::Session::Base.controller.inspect
...
end
end
而且我看到Authlogic::ControllerAdapters::RailsAdapter ... ...因此, Controller 已设置但未持久。我想知道这是否与从Rails3切换到Rails4有关?
任何对此的见识将不胜感激。
那些有兴趣的人的 gem 版本:
gem rspec核心(2.14.5)
gem authlogic(3.3.0)
gem rails (4.0.0)
最佳答案
对于https://stackoverflow.com/a/5803121而言,请求规范只是 ActionDispatch::IntegrationTest
的一薄层包装。因此,与常规 Controller 规范不同,无法直接访问session
。
因此,不可能直接使用 AuthLogic
直接登录用户,而ojit_a确实依赖 session 和cookie:
对于请求/集成/api/功能规范,必须直接向登录路径发出请求,以在后台设置正确的 session /cookie。然后,将使用适当的值将集成 session 发送回去(就像普通的Web请求一样)。
为了使生活更轻松,您可以添加一个辅助方法,该方法可以包含在请求/集成/api/功能规范中:
# spec/support/auth_logic_helpers.rb
module Authlogic
module TestHelper
# You can call this anything you want, I chose this name as it was similar
# to how AuthLogic calls it's objects and methods
def create_user_session(user)
# Assuming you have this defined in your routes, otherwise just use:
# '/your_login_path'
post user_session_path, login: user.login, password: user.password
end
end
end
# Make this available to just the request and feature specs
RSpec.configure do |config|
config.include Authlogic::TestHelper, type: :request
config.include Authlogic::TestHelper, type: :feature
end
关于ruby-on-rails - Rails + Authlogic + rspec,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18751297/