2016-04-25 3 views
1

多くの旅行を伴う請求書を持つプロジェクトを持っています。請求書に旅行が必要であることを要請する新しい話が私のところに来ました。私はvalidates :trips, presence: trueのバリデーションを追加しましたが、FactoryGirlは関連する旅行を作成する前に請求書を保存しようとしているので、今ではいくつかのテストを吹き飛ばしています。子供の有無の確認を伴う親と子を作成する工場少女

FactoryGirl.define do 
    factory :invoice do 
    sequence(:invoice_id) { SecureRandom.uuid} 
    merchant 
    amount 100.00 
    item_count 1 
    paid false 
    currency "GBP" 
    invoice_type "pre-flight" 
    service_rendered false 
    cancelled false 

    after(:create) { |object| create(:trip, invoice_id: object.invoice_id)} 
    end 

end 

これらのオブジェクトを作成するにはどうすればよいですか。工場レベルでは、この動作を利用したテストが多数あり(現在はそのために失敗しているため)、Thisはテストレベルでは良い解決策のようです。

更新 私のテストを今緑にするのはまだ苦労しています。 42次のコードでテストがエラーになります。

検証に失敗しました:ツアーは私のFactoryGirlコード

before(:create) { |object| object << build(:trip, invoice_id: object.invoice_id)} 

私の現在の更新の行はここでも私の旅の工場で空白にすることはできません。今 @andrykonchinは正しかったの作業

FactoryGirl.define do 
    factory :trip do 
    depart_airport "MCI" 
    arrive_airport "ORD" 
    passenger_first_name "Joe" 
    passenger_last_name "Business" 
    passenger_count 1 
    departure_date {10.days.from_now} 
    invoice 
    end 

end 

。私はあなたを助けるかもしれない、私のbefore(:create)...

before(:create) { |object| object.trips << build(:trip, invoice_id: object.invoice_id)}

答えて

1

beforeコールバックで何かを逃していました。 documentationから

前(:作成) - 工場が保存される前に

( FactoryGirl.create経由)と呼ばれるそれは次のようになります。

before(:create) { |object| object.details << build(:invoice_detail)} 
+0

親が作成される前に親のIDを持つ子を作成することは可能でしょうか? – CheeseFry

+0

@CheeseFryでも可能ですが、データベース内の外部キーの制約がそれを防止します。あなたは*作成するべきではありません*、子モデルを構築して(親モデル)の関連付けに追加するだけです。親モデル(請求書)を保存すると、私の例のように、新しい子モデルも保存されますか? – andrykonchin

+0

上記のコードを更新しています。あなたの例をありがとう! – CheeseFry

関連する問題