2017-08-03 114 views
0

什麼是分配已存在的關聯的正確方法?FactoryGirl關聯重複鍵錯誤

我想在用戶和城市之間分配一個has_one關係,其中同一城市可以被許多用戶或其他實體(例如事件)使用。

代碼

FactoryGirl.define do 
    factory :user do 
    name 'john' 

    trait :in_boston do 
     association :city, factory: :boston 
    end 
    end 
end 

錯誤

PG :: UniqueViolation:錯誤:重複鍵值違反唯一約束 「city_pkey」,因爲它試圖在數據庫中創建波士頓的兩倍。

我想要做的只是參考現有的工廠,而不是創建一個新的。

我目前的工作(但不夠理想)的解決方案

FactoryGirl.define do 
    factory :user do 
    name 'john' 

    trait :in_boston do 
     after(:create) do |user| 
     user.city = City.find_by_name('Boston') || create(:boston) 
     end 
    end 
    end 
end 

任何指導,將不勝感激,謝謝。

回答

0

所以,我會假設你的模型代碼是黃金的,並告訴你如何設置測試。我不確定爲什麼你需要工廠根據城市是否存在決定權力。只需在自己的工廠實例化該城市,並在您的測試設置中調用該關聯。

工廠

# factories/cities.rb 
FactoryGirl.define do 
    factory :city do 
    name 'Boston' 
    end 
end 

# factories/users.rb 
FactoryGirl.define do 
    factory :user do 
    name 'john' 
    city 
    end 
end 

測試

describe 'blah' do 
    let(:city){ create :city } 
    let(:user){ create :user, city: city } 

    it 'user should have a city' do 
    expect(user.city.name).to eq 'Boston' 
    end 
end