RSpec

2011-06-10 22 views
7

ile denetleyicide örnek değişkenlerin sınanması Görünüm tarafından kullanılmak üzere birkaç örnek değişken oluşturduğu şekilde böyle bir denetleyici verildiğinde, genellikle bunların her birinin düzgün şekilde ayarlandığını test eder misiniz? İstediğiniz gibi görünüyor, ama aynı zamanda biraz da zor gibi görünüyor. Doğru yaklaşım nedir?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 

kodu da Madem senin yöntemin etrafında iyi kapsama sahip olarak https://gist.github.com/1018190

cevap

11

Bir denetleyici belirteci yazacaksanız, o zaman evet, örnek değişkenlerin atanmış olduğunu sınayın. 'Trickiness' Çok diğer modeller/kütüphaneler üzerinde bağımlılıkları geldiği için bu yöntem çağrıları saplama edebilirsiniz: index doğru yöntemi çağırır testi:

# 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

nakledilir, vb doğru değerlerle bir şey ile senin yöntem doğru zamanlarda çağrıldığı test edebilirsiniz gibi:

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

ben aşağıdaki gibi bölmek istiyorum. Sonra yöntemin çalışıp çalışmadığını test edin.

Yani

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 gibi bir şey bu yardımcı olur.