我正在尝试在我的应用中测试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,重定向断言也会失败。有没有人发现导致此测试失败的代码有什么问题?
答案 0 :(得分:2)
问题是我在ApplicationController中救了AccessDenied,所以从未引发异常。
答案 1 :(得分:0)
您也需要阻止新动作。
if !(user.role? :member)
can :new, User
end
可能是具有“成员”角色的用户可以访问新操作(显示用户的表单)和限制访问以创建操作。
还有一件事,我们不需要使用
cannot [:any_action], [Model]
我们可以通过can
本身完成所有事情。