2016-12-28 10 views
0

Decidingscontrollerで#createをテストし、Undertakingモデルに関連してundertaking_id列を持っています。Askingに関連してasking_id列がありますモデル。 私の工場/ decidings.rbは以下の通りです。ファクトリーガール、1対1(has_one)とrspecのアソシエーションを表現できません

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

およびMy 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

idsは、レコードが保持されないため、nilです。 buildメソッドを使用すると、レコードはデータベースに保存されません。レコードが保存されていない場合は、IDを持つことはできません。代わりにcreateメソッドを使用してください。

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

ああ、それは動作します!ありがとうございました! –

関連する問題