Factorygirl ,我无法表达1对1(has_one)与rspec的联想

Factorygirl , I can't express the association of 1 on 1 (has_one) with rspec

我想在 Decidingscontroller 中测试 #create,Deciding 模型有 undertaking_id 列与 Undertaking 模型相关联,并且有 asking_id 列与 Asking 模型相关联。 所以,我的 factories/decidings.rb 在下面。

    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 在这种情况下如下。

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

所以我无法创建测试,因为 undertaking_id 和 asking_id 为零。 为什么 undertaking_id 和 asking_id 为零?请帮我... 无论如何,我的 factories/asking.rb 在下面。

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

ids 为 nil,因为记录未持久化。当您使用 build 方法时,它不会在数据库中保存记录。如果一条记录没有被保存,它就不能有 ID。请改用 create 方法。

试试这个:

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