2011-06-10 18 views
7

Dado un controlador como este en el que crea varias variables de instancia para su uso por la vista, ¿generalmente probaría que cada una de ellas se establece correctamente? Parece que querrías, pero también parece un poco, podría ser un poco complicado. ¿Cuál es el enfoque correcto?Prueba de variables de instancia en el controlador con 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 

El código también se encuentra publicada en https://gist.github.com/1018190

Respuesta

11

Si va a escribir una especificación de controlador, entonces sí, de todos modos pruebe que las variables de instancia están asignadas. Gran parte de la 'astucia' puede venir de dependencias de otros modelos/bibliotecas, así apagar esas llamadas a métodos:

# 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

Siempre y cuando usted tiene una buena cobertura alrededor de su método, se puede probar que su método está siendo llamado en el momento adecuado, con los valores adecuados Algo etc. como:

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

que habría que dividir de la siguiente manera: la prueba de que el index llama al método correcto. Luego prueba si el método funciona.

así que algo como

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 

espero que esto ayude.

Cuestiones relacionadas