2016-04-25 6 views
1

Haben Sie ein Projekt, das Rechnungen mit vielen Reisen hat. Neue Geschichte kam auf meine Art und verlangte, dass eine Rechnung eine Reise MUSS. Ich habe eine Validierung hinzugefügt , aber es ist jetzt eine Reihe meiner Tests in die Luft gehen, da FactoryGirl versucht, die Rechnung vor dem Erstellen der zugehörigen Reise zu speichern.Erstellen Sie Eltern und Kind mit Kind Anwesenheit Validierung Factory Girl

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 

Was kann ich tun, um diese Objekte zu erstellen. Vorzugsweise auf der Werksebene, da es zahlreiche Tests gibt, die dieses Verhalten nutzen (und derzeit aufgrund dessen versagen). This scheint eine gute Lösung auf der Teststufe zu sein.

Update Immer noch kämpfen mit meinen Tests grün jetzt. 42 Tests sind mit dem folgenden Code fehlgeschlagen.

Validierung fehlgeschlagen: Reisen kann nicht leer sein

Meine gegenwärtige aktualisierte Zeile in meinem Code factory

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

Hier ist auch meine Reise Fabrik.

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 

Jetzt @andrykonchin Arbeiten richtig war. Ich hatte etwas in meinem before(:create)...

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

Antwort

1

before Rückruf verpasst kann Ihnen helfen.

Vom documentation:

vor (: create) - aufgerufen, bevor ein Werk gespeichert wird (über FactoryGirl.create)

Es würde wie folgt aussehen:

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

Wäre es möglich, ein Kind mit der Eltern-ID zu erstellen, BEVOR der Elternteil erstellt wird? – CheeseFry

+0

@CheesFry, können Sie, aber Fremdschlüssel Einschränkungen in einer Datenbank wird es verhindern. Sie sollten * create * nicht erstellen, Sie müssen nur ein Kindmodell * erstellen * und es der Assoziation (Elternmodell) hinzufügen; Wenn Sie das Elternmodell (Rechnung) speichern, wird auch das neue Kindmodell gespeichert, wie in meinem Beispiel, oder? – andrykonchin

+0

Ich habe meinen obigen Code aktualisiert, der es funktioniert hat. Danke für dein Beispiel! – CheeseFry