2012-08-31 82 views
0

我的測試是這樣的:我是否需要在此測試中創建每個對象?

def setup 
    @period_registration= FactoryGirl.create(:period_registration) 
    end 


test "should post save_period" do 
    sign_in(FactoryGirl.create(:user)) 
    assert_difference('PeriodRegistration.count') do 
     post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration) 
    end 
    assert_not_nil assigns(:period_registration) 

    end 

但是當我運行它,我得到這個錯誤:

1) Error: 
test_should_post_save_period(PeriodRegistrationsControllerTest): 
NoMethodError: undefined method `event' for nil:NilClass 

這裏是我的控制器:

def save_period 
    @period_registration = PeriodRegistration.new(params[:registration]) 
    @period_registration.save 
    flash[:success] = "Successfully Registered for Session." 
    redirect_to event_url(@period_registration.period.event) 
    end 

我的工廠是這樣的:

factory :event do 
    name 'First Event' 
    street '123 street' 
    city 'Chicago' 
    state 'Iowa' 
    date Date.today 
    end 


    factory :period do 
    name 'First Period' 
    description 'This is a description' 
    start_time Time.now + 10.days 
    end_time Time.now + 10.days + 2.hours 
    event 
    product 
    end 

factory :period_registration do 
    user 
    period 
    end 

我是否需要創建句點對象和事件對象?如果是這樣如何?我不認爲這是問題,因爲我相信在各個工廠中有「時期」,然後是「產品」,然後是「事件」會自動產生這些問題。

任何想法從哪裏看?

回答

1

簡短的回答 - 是的,你確實創建了對象。

長的答案:

  1. 在控制器:

    @period_registration.period.event 
    

    這行代碼違反The Law Of Demeter。這不是很好的設計。這行代碼應該如下所示:

    @period_registration.event 
    

    但是您必須在PeriodRegistration模型中創建新方法。方法的最簡單的變體可以是:

    def event 
        period.event 
    end 
    
  2. 在控制器:你不檢查PeriodRegistration模型保存與否。

  3. 據我所知PeriodRegistration模型有2個關聯,當您使用FactoryGirl.attributes_for時,工廠不會創建關聯的對象,它只是給你PeriodRegistration的一組屬性。爲了使這個測試通過,你應該創建這2個對象,因爲你呼叫控制器。最好的做法是 - 測試應該只有一個斷言。例如:

    def setup 
        @user = FactoryGirl.create(:user) 
        @period = FactoryGirl.create(:period) 
    end 
    
    test "should post save_period" do 
        sign_in(@user) 
        assert_difference('PeriodRegistration.count') do 
        post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration, user: @user, period: @period) 
        end 
    end 
    
    test "should assings @period_registration" do 
        sign_in(@user) 
        post :save_period, period_registration: FactoryGirl.attributes_for(:period_registration, user: @user, period: @period) 
        assert_not_nil assigns(:period_registration) 
    end 
    
  4. 當測試控制器時,您可以使用模擬對象而不是真實模型。

+0

關於你的#1,這是行不通的。我在控制檯中測試了它,並且需要執行'pr.period.event'來獲取事件。 –

+0

你的#3幫助我解決了另一個問題,雖然我正在做! –

+0

@NoahClark關於#1。您必須在PeriodRegistration模型中創建新方法。我已經更新了我的答案。 –

相關問題