【问题标题】:Functional testing Authlogic?功能测试 Authlogic?
【发布时间】:2009-06-16 01:04:23
【问题描述】:

在我的一些控制器中,我有一个 before_filter 来检查用户是否已登录?用于 CRUD 操作。

application.rb

def logged_in?
  unless current_user
    redirect_to root_path
  end
end

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

但是现在我的功能测试失败了,因为它重定向到 root。所以我需要一种方法来模拟一个会话已经创建,但我尝试过的没有任何效果。这是我现在拥有的,测试几乎忽略了它:

test_helper.rb

class ActionController::TestCase
  setup :activate_authlogic
end

posts_controller_test.rb

class PostsControllerTest < ActionController::TestCase
  setup do
    UserSession.create(:username => "dmix", :password => "12345")
  end

  test "should get new" do  
    get :new
    assert_response :success
  end

我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails ruby tdd


    【解决方案1】:

    你应该在 UserSession.create 中传递 ActiveRecord 对象

    类似:

    u = users(:dmix)
    UserSession.create(u)
    

    【讨论】:

    • 如果你有一个不依赖于它们的应用程序,我真的鼓励你远离固定装置进行测试。它们很难维护,而且真的很令人沮丧。看看 railscast,Factory not Fixtures。
    • 通过创建这样的用户,您并不是在测试是否在您的控制器中调用了适当的检查(例如,必须登录,必须是管理员等)。最好模拟预期的方法以确保它们被调用,例如对于摩卡:mock(@controller).expects(:current_user).returns(@user)
    【解决方案2】:

    http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/TestCase

    首先您需要激活 AuthLogic,以便您可以在测试中使用它。

    setup :activate_authlogic
    

    那么你需要一个有效的用户记录,正如 Anton Mironov 指出的那样。

    【讨论】:

    【解决方案3】:

    我在我的控制器的 rspec 测试中所做的只是使用 Machinist 创建一个用户,然后将该用户分配为 current_user。

    def login_user(options = {})
      user = User.make(options)
      @controller.stub!(:current_user).and_return(user)
    end
    

    这会将 current_user 附加到控制器,这意味着您的 login_in?方法将适用于您的测试。

    你显然可能需要调整它以在 Test::Unit 中工作,如果你不使用它,并且没有 Machinist,因为我使用 rspec,但我确信原理是相同的。

    【讨论】:

      【解决方案4】:

      如果您希望所有测试都设置 Authlogic,请将其放入 test_helper.rb

      class ActionController::TestCase
        def self.inherited(subclass)
          subclass.instance_eval do
            setup :activate_authlogic
          end
        end
      end
      

      【讨论】:

      • 这个位破坏了我在 ruby​​ 1.9 中的测试并且很难追踪。我只是在类级别而不是在 instance_eval 内部进行 setup :activate_authlogic。
      【解决方案5】:

      Here 是指向 AuthLogic 测试文档的链接。这是一个重要的,但有点被埋没了(Simone 发布的同一个链接,但他不再工作了)。

      该页面包含使用 AuthLogic 进行身份验证测试应用程序所需的所有信息。

      此外,正如 railsninja 建议的那样,使用工厂而不是固定装置。看看factory_girlmachinist;选择你的毒药,它们都很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-23
        • 2020-12-09
        相关资源
        最近更新 更多