2012-01-22 94 views
0

我想在我的应用中使用Authlogic测试CanCan能力。我已经验证了使用实际站点时的正确行为,但我想编写一个功能测试,以便在将来此行为发生中断时提醒我。我的能力文件是简单,看起来如下:CanCan能力失败的功能测试

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

你的控制器在哪里? – Zabba

回答

2

的问题是,我是拯救存取遭拒在我的ApplicationController,所以异常从来没有被提出。

0

你需要阻止新的动作了。

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

可以是具有“成员”角色的用户可以访问新的动作(用户显示形式)并限制存取创建操作。

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

cannot [:any_action], [Model] 

我们可以通过can自己做的一切。

+1

问题是我救了我的ApplicationController中的AccessDenied,所以这个异常从未被提出。 – Max