Frage Was ist der Unterschied zwischen den Build- und Create-Methoden in FactoryGirl?


Die Einführung des Fabrikmädchens umreißt 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 immer noch nicht die praktischen Unterschiede zwischen den beiden. Kann jemand ein Beispiel geben, wo man das eine benutzen möchte und nicht das andere? Vielen Dank!


76
2017-12-31 05:57


Ursprung


Antworten:


Das create() Methode beharrt die Instanz des Modells während die build() Methode hält es nur im Speicher.

Persönlich benutze ich die create() Methode nur dann, wenn Persistenz wirklich notwendig ist, da das Schreiben in die Datenbank das Testen zeitaufwendig macht.

z.B.

Ich erstelle Benutzer zur Authentifizierung mit create() weil meine Authentifizierungs-Engine die Datenbank abfragt.

Um zu überprüfen, ob ein Modell ein Attribut hat, build() Methode wird tun, weil kein DB-Zugriff erforderlich ist.

it{Factory.build(:user).should respond_to(:name)}

Aktualisieren

"Es gibt eine Ausnahme, die Build" erstellt ", wenn Sie Assoziationen aufbauen, d. H. Ihre Assoziation ist nicht länger im Gedächtnis, sondern besteht fort. Denken Sie daran" - Shakes


95
2018-01-04 21:03



Verwenden FactoryGirl.build(:factory_name) hält nicht an der db und ruft nicht an save!, damit Ihre Active Record-Validierungen nicht ausgeführt werden. Dies ist viel schneller, aber Validierungen könnten wichtig sein.

Verwenden FactoryGirl.create(:factory_name) wird in der db beibehalten und Active Record-Validierungen aufrufen. Dies ist offensichtlich langsamer, kann jedoch Validierungsfehler auffangen (wenn Sie in Ihren Tests daran interessiert sind).


10
2017-08-01 19:51



FactoryGirl.create() erstellt ein neues Objekt und neue Verknüpfungen (wenn die Fabrik eine hat). Sie werden alle in einer Datenbank gespeichert. Außerdem werden Validierungen für Modelle und Datenbanken ausgelöst. Rückrufe after(:build) und after(:create) wird aufgerufen, nachdem die Fabrik gespeichert wurde. Ebenfalls before(:create) wird aufgerufen, bevor die Fabrik gespeichert wird.

FactoryGirl.build() speichert ein Objekt nicht, wird jedoch weiterhin Anfragen an eine Datenbank senden, wenn die Factory über Verknüpfungen verfügt. Es löst nur Validierungen für verknüpfte Objekte aus. Rückrufen after(:build) wird nach dem Bau der Fabrik aufgerufen.

Beachten Sie, dass in den meisten Fällen das Testen von Modellen am besten ist build_stubbed für bessere Leistung. Lesen Sie mehr darüber Hier.


0
2018-05-04 10:00