FactoryGirl: Populate a hat viele relationserhaltende Build-Strategien

8

Mein Problem scheint sehr verbreitet, aber ich habe keine Antwort in der Dokumentation oder im Internet selbst gefunden.

Es könnte ein Klon dieser Frage scheinen, has_many respektieren build strategie in factory_girl aber 2,5 Jahre nach diesem Post hat sich factory_girl stark verändert.

Ich habe ein Modell mit einer has_many-Beziehung namens fotos. Ich möchte das bevölkern, das hat viele Beziehungen, die meine Wahl der Baustrategie beibehalten.

Wenn ich offering = FactoryGirl.build_stubbed :offering, :stay anrufe, erwarte ich, dass offering.photos eine Sammlung von Stub-Modellen ist.

Der einzige Weg, den ich gefunden habe, um dies zu erreichen, ist dieser:

%Vor%

Es muss nicht gesagt werden, dass es einen besseren Weg dafür geben muss.

Ideen?

    
miguel.camba 09.11.2012, 13:13
quelle

5 Antworten

8

Hier ist eine etwas sauberere Version von Flipstones Antwort:

%Vor%     
Chewi 08.11.2013, 14:34
quelle
10

Sie können die verschiedenen Callbacks von FactoryGirl verwenden:

%Vor%     
Aaron Gibralter 15.11.2012 20:35
quelle
3

Sie können die FactoryRunner-Klasse auch direkt aufrufen und die zu verwendende Erstellungsstrategie übergeben.

%Vor%     
Flipstone 11.02.2013 15:35
quelle
1

Andere Antworten haben einen Fehler, die inverse Zuordnung wird nicht richtig initialisiert, z. offering.photos.first.offering == offering ist false . Noch schlimmer ist, dass das offering ein neues Offering für jedes photos ist.

Außerdem ist die explizite Angabe einer Strategie überflüssig.

Um den Fluss zu überwinden und die Dinge zu vereinfachen:

%Vor%

@instance ist eine Instanz von Offering , die zur Zeit von der Factory erstellt wird. Für die Neugierigen ist der Kontext FactoryGirl::Evaluator .

Wenn Sie @instance nicht mögen, wie ich es tue, können Sie in evaluator.rb suchen und folgendes finden:

%Vor%

Ich mag wirklich, wie itself aussieht:

%Vor%

Kann itself verwenden, undefiniere es auf Evaluator :

%Vor%

Es wird an die @instance übergeben und gibt die @instance selbst zurück.

Um ein vollständiges Beispiel mit mehreren Fotos zu bieten:

%Vor%

Verwendung:

%Vor%

Seien Sie vorsichtig, einige Dinge funktionieren möglicherweise nicht wie erwartet:

  • offering.photos.first.offering_id wird überraschenderweise nil ;
  • sein
  • offering.photos.count trifft die Datenbank mit SELECT COUNT(*) FROM hotel_photos ... (und wird in den meisten Fällen 0 ergeben), bitte verwenden Sie length oder size in Assertions.
phil pirozhkov 29.04.2017 19:32
quelle
0

So etwas funktioniert für mich:

%Vor%     
Ari 08.04.2014 20:13
quelle