Die Einführung von Factory Girl beschreibt den Unterschied zwischen FactoryGirl.build()
und FactoryGirl.create()
:
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Ich verstehe die praktischen Unterschiede zwischen den beiden immer noch nicht. Kann jemand ein Beispiel geben, wo Sie das eine und nicht das andere verwenden möchten? Vielen Dank!
quelle
create
durch ersetztbuild
und rückgängig gemacht werden kann, wenn der Test fehlschlägt?#create
und speichert das persistierte Objekt von der Festplatte oder gibt es das Objekt zurück, das sich nach dem Persistieren im Speicher befindet? Mit anderen Worten, ist dascreate(...)
gleichbedeutend mitcreate(...).reload
?Die Verwendung
FactoryGirl.build(:factory_name)
bleibt für die Datenbank nicht bestehen und wird nicht aufgerufensave!
, sodass Ihre Active Record-Überprüfungen nicht ausgeführt werden. Dies ist viel schneller, aber Validierungen können wichtig sein.Die Verwendung
FactoryGirl.create(:factory_name)
bleibt in der Datenbank bestehen und ruft Active Record-Validierungen auf. Dies ist offensichtlich langsamer, kann jedoch Validierungsfehler auffangen (wenn Sie diese in Ihren Tests berücksichtigen).quelle
FactoryGirl.create()
erstellt ein neues Objekt und neue Assoziationen (falls vorhanden). Sie werden alle in einer Datenbank gespeichert. Außerdem werden sowohl Modell- als auch Datenbanküberprüfungen ausgelöst. Rückrufeafter(:build)
undafter(:create)
werden aufgerufen, nachdem die Fabrik gespeichert wurde. Auchbefore(:create)
genannt werden , bevor die Fabrik gespeichert wird.FactoryGirl.build()
speichert kein Objekt, stellt jedoch weiterhin Anforderungen an eine Datenbank, wenn die Factory über Zuordnungen verfügt. Es werden nur Überprüfungen für zugeordnete Objekte ausgelöst. Rückrufafter(:build)
wird nach dem Bau der Fabrik aufgerufen.Beachten Sie, dass in den meisten Fällen beim Testen Modelle am besten
build_stubbed
für eine bessere Leistung verwendet werden können. Lesen Sie hier mehr darüber .quelle