2011-06-10 3 views
7

Étant donné un contrôleur comme celui-ci où il crée plusieurs variables d'instance à utiliser par la vue, testeriez-vous généralement que chacune de ces variables est correctement définie? Il semble que vous voudriez, mais il semble aussi un peu, il pourrait être un peu difficile. Quelle est la bonne approche?Test des variables d'instance dans le contrôleur avec RSpec

class StaffsController < ApplicationController 

    def index 
    set_index_vars 
    @all_staff = Staff.find_staff_for_business_all_inclusive(current_business_id) 
    respond_to do |format| 
    format.html { render :action => "index", :locals => { :all_staff => @all_staff, :all_services => @all_services, :new_vacation => @new_vacation } } 
    end 
    end 

    def set_index_vars 
    @days_of_week = days_of_week 
    @first_day_of_week = DefaultsConfig.first_day_of_week 

    @all_services = Service.services_for_business(current_business_id) 

    @new_vacation = StaffVacation.new 
    @has_hit_staff_limit = current_user_plan.has_hit_staff_limit? 
    end 

end 

Le code est également affiché à https://gist.github.com/1018190

Répondre

11

Si vous voulez écrire une spécification de contrôleur, alors oui, vérifiez par tous les moyens que les variables d'instance sont assignées. Une grande partie de la « rouerie » peuvent provenir de dépendances sur d'autres modèles/bibliothèques, donc bouchonner les appels de méthode:

# air code 
Staff.stub(:find_staff_for_business_all_inclusive) {array_of_staff} 
controller.stub(:days_of_week) {['Monday','Tuesday',....etc...]} 
DefaultsConfig.stub(:first_day_of_week) {"Monday"} 
Service.stub(:services_for_business).with(some_value_for_the_current_business_id).\ 
    and_return(some_relevant_value) 
StaffVacation.stub(:new) {something_meaningful} 
controller.stub_chain(:current_user_plan,:has_hit_staff_limit?) {false} 

get :index 
assigns(:days_of_week).should == ['Monday','Tuesday',....etc...] 
# ...etc... 
0

Tant que vous avez une bonne couverture autour de votre méthode, vous pouvez vérifier que votre méthode est appelée au bon moment, avec les bonnes valeurs, etc. Quelque chose comme:

describe StaffsController do 
    describe "GET #index" do 
    it "should call set_index_vars" do 
     controller.should_receive(:set_index_vars) 
     get :index 
    end 
    end 

    describe "#set_index_vars" do 
    it "should assign instance variables with correct values" do 
     # or wtv this is supposed to do 
     get :index 
     assigns(:days_of_week).should == controller.days_of_week 
     # etc .. 
    end 
    end 
end 
1

Je fendrait le comme suit: essai que le index appelle la méthode correcte. Ensuite, testez si la méthode fonctionne.

donc quelque chose comme

describe StaffsController do 
    describe "GET #index" do 
    it "calls set_index_vars" do 
     controller.should_receive(:set_index_vars) 
     get :index 
    end 
    # and your usual tests ... 
    end 

    describe "#set_index_vars" do 
    before(:each) do 
     # stub out the code not from this controller 
     controller.stub_chain(:current_user_plan, :has_hit_staff_limit?).and_return(false) 
     .. etc .. 

     controller.set_index_vars 
    end 
    it { assigns(:days_of_week).should == controller.days_of_week } 
    it { assigns(:has_hit_staff_limit).should be_false 
    # etc .. 
    end 
end 

Hope this helps.

Questions connexes