【问题标题】:Rails4 + Authlogic + rspecRails4 + Authlogic + rspec
【发布时间】:2013-09-16 01:47:03
【问题描述】:

使用 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_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

我更新了我的应用程序控制器以显示当前会话:

  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 评论,我正确地得到“匿名”。当我取消注释时,我看到我的用户会话为零。我尝试查看 authlogic 代码,但在 Authlogic::Session:Persistence::InstanceMethods#persisting?

我正在尝试调试。这是我到目前为止的位置。

在这里,我们尝试将 Authlogic::Session::Base.controller 设置为测试的模拟控制器: https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/test_case.rb#L109

在我的规范中,我看到 @controller 是一个 Authlogic::TestCase::MockController

在我的规范中,我看到 Authlogic::Session::Base.controller 设置为该模拟控制器。

但是,我随后检查:

class ApplicationController < ActionController::Base
  ...

  def current_user_session
    raise Authlogic::Session::Base.controller.inspect
    ...
  end
end

我看到 Authlogic::ControllerAdapters::RailsAdapter ...所以不知何故控制器正在设置但没有持久化。我想知道这是否与从 Rails3 切换到 Rails4 有关?

任何对此的见解将不胜感激。

为感兴趣的人准备的宝石版本: gem rspec-core (2.14.5) 宝石 authlogic (3.3.0) 宝石导轨 (4.0.0)

【问题讨论】:

    标签: ruby-on-rails rspec ruby-on-rails-4 rspec2 authlogic


    【解决方案1】:

    根据https://stackoverflow.com/a/5803121,请求规范只是ActionDispatch::IntegrationTest 的薄包装。因此,与普通控制器规范不同,无法直接访问 session

    因此,无法直接使用 AuthLogic 直接登录用户,这确实依赖于会话和 cookie:

    它首先进行身份验证,然后设置适当的会话值和 cookie 以保持会话。

    对于请求/集成/api/功能规范,需要直接向登录路径发出请求,以便在后台设置正确的会话/cookie。然后将使用正确的值发回集成会话(就像正常的 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
    

    【讨论】:

    • 我必须post user_session_path, user_session: { email: user.email, password: user.password}。 POST 到 login_path 不会创建会话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多