2017-05-12 22 views
1

このテストで私が間違っていることは何ですか?工場内の連想regionはそれを構築されているとき、私は今、カラムlidモデルの主キー属性を変更すると、FactoryGirl重複キー値が一意制約に違反する

FactoryGirl.define do 
    factory :rep do 
    lid 1 
    email '[email protected]' 
    association :boss, strategy: :build 
    association :region, factory: :region, strategy: :build 
    end 

    factory :boss, class: Rep do 
    lid 2 
    email '[email protected]' 
    manager true 
    association :region, factory: :region, strategy: :build 
    end 
end 

を参照するために地域の主キーを変更している地域

class Region < ApplicationRecord 
    self.primary_key = "lid" 
    has_many :reps 
end 

ため、このクラスを考えると

require "rails_helper" 

describe "Rep", type: :feature do 
    scenario "has a Manager and a Region" do 
    rep = FactoryGirl.create(:rep) 
    expect(rep.boss.email).to eq("[email protected]") 
    expect(rep.region.name).to eq("NAT") 
    end 
end 

地域の一意性検証を引き起こしています。

別のシステムに由来するlegacyid(lid)と呼ばれるこれらのIDを使用し、それらを主キーとして使用します(データベース移行はそれらを処理するためにセットアップされています)。

私は私が望むすべてがrepboss同じregionに所属するので、ときに私の両方で

FactoryGirl.define do 
    factory :region do 
    lid 10 
    name 'NAT' 
    end 
end 

標準「ID」フィールドを持って、このアプリに固有な他の関連付けを構築することができますbossregionの関連付けが付属して工場をrepを構築する。

うまくいけば、それはちょうど私が検討しておりませんので、愚かなものである:混乱し:

rspec spec spec/features/reps/have_managers.rb 
F 

Failures: 

    1) Reps belong to a manager 
    Failure/Error: rep = FactoryGirl.create(:rep) 

    ActiveRecord::RecordNotUnique: 
     PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_regions_on_lid" 
     DETAIL: Key (lid)=(10) already exists. 
     : INSERT INTO "regions" ("lid", "name", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "lid" 
    # ./spec/features/reps/have_managers.rb:6:in `block (2 levels) in <top (required)>' 
    # ------------------ 
    # --- Caused by: --- 
    # PG::UniqueViolation: 
    # ERROR: duplicate key value violates unique constraint "index_regions_on_lid" 
    # DETAIL: Key (lid)=(10) already exists. 
    # ./spec/features/reps/have_managers.rb:6:in `block (2 levels) in <top (required)>' 

私は地域の関連付けをコメントアウトすることができますように、これまでのところ、私はregion_id null false flagをオフにするとbelongs_to optionalを作ると離れて頂いております今のところそれを無視してください

+0

を。 – chumakoff

答えて

2

私はあなたがこれを考え出したと確信していますが、これをカバーするためにあなたの工場では重複しています。ボスは担当者であるため、ボスファクトリと担当ファクトリを関連付ける必要はありません。そうしないと、重複するものが重複してしまいます。代わりに、形質を使用して検討してください。

FactoryGirl.define do 
    factory :rep, class: Rep do 
    sequence(:lid) { |n| n } 
    sequence(:email) { |e| "first.last#{e}@email.com" } 
    association :region, factory: :region 

    trait :boss do 
     manager true 
    end 
    end 
end 

あなたはこれらを構築/作成したいときに、あなたはこのようなものを使用することができます:あなたはあなたの工場で動的にユニーク `lid`sを生成する必要があります

let(:rep) { create(:rep) } 
let(:boss) { create(:rep, traits: [:boss]) } 
関連する問題