2010-12-20 2 views
2

J'utilise RSpec et CanCan dans un projet. Je teste ma logique d'autorisation dans les spécifications relatives à la classe Ability. Pour les contrôleurs, je veux juste m'assurer que je fais une vérification d'autorisation. J'ai mis en place une macro de contrôleur, mais cela ne semble pas fonctionner correctement.Test de contrôleur RSpec et CanCan

Donc vraiment j'ai deux questions. Un, est la stratégie suffisante pour tester la logique d'autorisation de mes contrôleurs (ou devrais-je tester la logique d'autorisation du contrôleur plus)? Deux, est-ce que quelqu'un voit ce que je fais mal pour que cela ne fonctionne pas?

#plan_orders_controller.rb 
def approve 
    plan_order = PlanOrder.find(params[:id]) 
    authorize! :update, plan_order 
    current_user.approve_plan_order(plan_order) 
    redirect_to plan_order_workout_plan_url(plan_order) 
end 

#controller_macros.rb 
def it_should_check_permissions(*actions) 
    actions.each do |action| 
    it "#{action} action should authorize user to do this action" do 
     @plan_order = Factory(:plan_order, :id=>1) 
     ability = Object.new 
     ability.extend(CanCan::Ability) 
     controller.stub!(:current_ability).and_return(ability)   

     get action, :id => 1 
     ability.should_receive(:can?) 
    end 
    end  
end 

La sortie que je reçois de RSpec est le suivant

Failure/Error: ability.should_receive(:can?) 
(#<Object:0x00000006d4fa20>).can?(any args) 
    expected: 1 time 
    received: 0 times 
# ./spec/controllers/controller_macros/controller_macros.rb:27:in `block (2 levels) in it_should_check_permissions' 

Je ne suis pas sûr de la méthode je vérifierai quand je l'appelle! Habilitent au contrôleur (ou il est automatiquement appelé via load_and_authorize_resource)

Répondre

2

should_receive est une attente de quelque chose qui arrive dans le futur. Inverser ces deux lignes:

get action, :id => 1 
ability.should_receive(:can?) 

si vous avez ceci:

ability.should_receive(:can?) 
get action, :id => 1 
Questions connexes