2012-01-22 15 views
0

Authlogicも使用する私のアプリケーションでCanCan機能をテストしようとしています。実際のサイトを使用しているときに正しい動作が動作することを確認しましたが、この動作が将来中断した場合に警告を発する機能テストを作成したいと思います。私の能力ファイルは単純で、次のようになります。UserSessionsControllerため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 

私のテストは、シンプルさ、そして次のようになります。ただ、参考のために、私のtest_helper.rbは次のようになります

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 

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でAccessDeniedを救済していたため、例外が発生していないということでした。

0

新しい操作もブロックする必要があります。

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

はユーザー 'を有するメンバーの役割は、新しいアクション(ユーザーの表示形式)にアクセスしてアクションを作成するためのアクセスを制限することができます。

そしてもう一つ、私たちはcan自身ですべてを行うことができます

cannot [:any_action], [Model] 

を使用する必要はありません。

+1

問題は、ApplicationControllerでAccessDeniedを救済していたため、例外が発生していないということでした。 – Max

関連する問題