2010-09-23 4 views
2

J'ai un tas de tests récurrents pour certaines de mes actions de contrôleur, qui nécessitent toutes une authentification. En conséquence, on finit par voir beaucoup de code comme le suivant:Comment faire ces tests RSpec plus DRY dans Rails

describe "authentication requests" do 
    it "should return 401 for unauthenticated :show" do 
     get :show 
     ... 
    end 

    it "should return 401 for unauthenticated :create" do 
     post :create 
     ... 
    end 
    end 

est-il une meilleure façon de sécher ce code afin que toute action dans le contrôleur qui a besoin d'authentification peut être décrite dans un essai?

Répondre

8

Si vous devez répliquer les tests sur plusieurs contrôleurs, vous pouvez utiliser des macros rspec. Créer un spec/macros/controller_macros.rb avec une méthode comme ceci:

def should_return_401_for_unauthenticated(test_controller) 
    describe test_controller, "authentication requests" do 
    it "should return 401 for show" do 
     get :show 
     response.code.should == "401" 
    end 
    it "should return 401 for create" do 
     post :create 
     response.code.should == "401" 
    end 
    end 
end 

Ensuite, dans chaque spécification du contrôleur qui a besoin des tests:

describe MyController do 
    should_return_401_for_unauthenticated(self) 
end 
0

Je ne suis pas un utilisateur rspec, mais vous pouvez faire quelque chose comme:

describe "authentication requests" do 

    limited_access = [:show, :create] 

    limited_access.each do |action| 
    it "should return 401 for unauthenticated :#{action}" do 
     get action 
     ## assert response 401 
    end 
    end 

end 

Ou d'avoir un seul test:

describe "authentication requests" do 

    limited_access = [:show, :create] 

    it "should return 401 for unauthenticated #{limited_access.to_sentence}" do 
    limited_access.each do |action| 
     get action 
     ## assert response 401 
    end 
    end 

end 

pourrait ajouter une méthode de spec_helper à l'abstrait pour vous ... Les possibilités sont infinies.

Questions connexes