CanCan能力测试失败的功能测试

时间:2012-01-22 16:50:46

标签: ruby-on-rails ruby-on-rails-3 authlogic cancan

我正在尝试在我的应用中测试CanCan功能,该功能也使用Authlogic。我已经验证了使用实际网站时正确的行为,但我想编写一个功能测试,如果将来这种行为中断,它会提醒我。我的能力文件很简单,如下所示:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    can :read, User
    can :manage, User, :id => user.id
    cannot :create, User
    can :destroy, UserSession

    if user.role? :guest
      can :create, UserSession
      cannot :destroy UserSession
    end
  end
end

我对UserSessionsController的测试也很简单,如下所示:

test "should redirect new for member" do
  default_user = login :default_user

  assert default_user.role? :member
  assert_raise(CanCan::AccessDenied) { get :new }
  assert_redirected_to root_path
end

仅供参考,我的test_helper.rb看起来像这样:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'authlogic/test_case'

class ActiveSupport::TestCase
  fixtures :all
  setup :activate_authlogic

  def login(user_login)
    UserSession.create users(user_login)
    users(user_login)
  end
end

当我运行我的代码时,我的测试失败了,但是:

test_should_redirect_new_for_member                                  FAIL
        CanCan::AccessDenied expected but nothing was raised.
        Assertion at test/functional/user_sessions_controller_test.rb:13:in `block in <class:UserSessionsControllerTest>'

如果我注释掉assert_raise,重定向断言也会失败。有没有人发现导致此测试失败的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

问题是我在ApplicationController中救了AccessDenied,所以从未引发异常。

答案 1 :(得分:0)

您也需要阻止新动作。

if !(user.role? :member)
 can :new, User
end

可能是具有“成员”角色的用户可以访问新操作(显示用户的表单)和限制访问以创建操作。

还有一件事,我们不需要使用

cannot [:any_action], [Model]

我们可以通过can本身完成所有事情。