2016-12-28 1 views
0

Decidingscontroller에서 #create를 테스트하고 Undertaking 모델과 관련하여 결정 모델에 undertaking_id 열이 있고 Askking과 관련된 asking_id 열이 있습니다. 모델. 그래서, 내 공장/decidings.rb 아래 있습니다.Factorygirl, rspec과 1 (has_one)의 관계를 표현할 수 없습니다

factory :deciding do 
     after(:build) do |deciding| 
     deciding.asking ||=build(:asking, deciding: deciding) 
     deciding.undertaking ||=build(:undertaking, deciding: deciding) 
     end 
    end 

및 내 spec/controllers/decidings_controller_spec.rb는 아래에 있습니다.

 RSpec.describe DecidingsController, type: :controller do 
     describe '#create' do 
     before do 
     @deciding=build(:deciding) 
     end 
     context 'correct_user login' do 
     before do 
      login_user(@deciding.asking.user) 
     end 
     it 'creates with deciding +1' do 
      expect{post :create , undertaking_id: @deciding.undertaking_id , asking_id: @deciding.asking_id}.to change(Deciding , :count).by(1) 
     end 
     end 
    end 
    end 

그러나이 경우 @ 결정은 다음과 같습니다.

#<Deciding id: nil, asking_id: nil, undertaking_id: nil, created_at: nil, updated_at: nil> 

그래서 undertaking_id 및 asking_id가 nil이므로 테스트를 만들 수 없습니다. 왜 undertaking_id 및 asking_id가 nil입니까? 제발 도와주세요 ... 어쨌든, 내 공장/asking.rb 아래에 있습니다.

FactoryGirl.define do 
    factory :asking do 
     association :user 
     sequence(:content){|i| "お願いします#{i}"} 
    end 
    end 
+0

당신은 대신 has_one''의'belongs_to' 연결을 사용해야합니다. 그러나 모델을 보여주지 않으므로 정확하게 말할 수는 없습니다. – iSunRise

답변

2

레코드가 유지되지 않으므로 ID가 nil입니다. build 메서드를 사용하면 데이터베이스에 레코드가 저장되지 않습니다. 레코드가 저장되지 않으면 ID를 가질 수 없습니다. 대신 create 메서드를 사용하십시오.

이 시도 :

factory :deciding do 
    after(:build) do |deciding| 
    deciding.asking ||= create(:asking) 
    deciding.undertaking ||= create(:undertaking) 
    end 
end 
+0

아, 작동합니다! 고맙습니다! –

관련 문제