Qual è la differenza tra i metodi build e create in FactoryGirl?


94

L'introduzione di Factory Girl delinea la differenza tra FactoryGirl.build()e FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

Ancora non capisco le differenze pratiche tra i due. Qualcuno può fare un esempio in cui vorresti usare uno e non l'altro? Grazie!

Risposte:


116

Il create()metodo mantiene l'istanza del modello mentre il build()metodo la mantiene solo in memoria.

Personalmente, utilizzo il create()metodo solo quando la persistenza è davvero necessaria poiché la scrittura su DB rende i test che richiedono tempo.

per esempio

Creo utenti con cui autenticare create()perché il mio motore di autenticazione interroga il DB.

Per verificare se un modello ha un attributo, il build()metodo farà perché non è richiesto l'accesso al DB.

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

Aggiornare

"C'è un'eccezione che build in realtà 'crea' quando stai costruendo associazioni, ovvero le tue associazioni non sono più nella memoria ma persistono. Tienilo a mente" - Shakes


14
C'è un'eccezione che build in realtà "crea" quando stai costruendo associazioni, cioè le tue associazioni non sono più in memoria ma persistono. Tienilo a mente
scuote il

@Shakes, non lavoro più sui binari. Lo controllerò appena posso.
Helio Santos

Qualcuno ha creato uno strumento per sostituire ogni istanza di createcon builde annullarlo se il test fallisce?
mgold

Fa #createleggere e restituire l'oggetto persistente dal disco, o lo fa restituire l'oggetto che è in memoria dopo persistente esso? In altre parole, fare è create(...)equivalente a create(...).reload?
Dennis

@mgold Vim è abbastanza bravo in questo genere di cose.
Espiazione limitata il

15

L'utilizzo FactoryGirl.build(:factory_name)non persiste nel database e non chiama save!, quindi le convalide del record attivo non verranno eseguite. Questo è molto più veloce, ma le convalide potrebbero essere importanti.

L'utilizzo FactoryGirl.create(:factory_name)persisterà nel database e richiamerà le convalide di Active Record. Questo è ovviamente più lento ma può rilevare errori di convalida (se ti interessano nei tuoi test).


11
Oppure potresti semplicemente fare FactoryGirl.build (: factory_name) .valid? che esegue le convalide senza salvare nel database.
jinavar1

1

FactoryGirl.create()creerà nuovi oggetti e associazioni (se la fabbrica ne ha). Saranno tutti persistenti in un database. Inoltre, attiverà sia la convalida del modello che quella del database. Richiama after(:build)e after(:create)verrà richiamato dopo il salvataggio della fabbrica. Inoltre before(:create)verrà chiamato prima del salvataggio della fabbrica.

FactoryGirl.build()non salverà un oggetto, ma effettuerà comunque richieste a un database se la fabbrica ha associazioni. Attiverà convalide solo per gli oggetti associati. La richiamata after(:build)verrà richiamata dopo la costruzione della fabbrica.

Si noti che nella maggior parte dei casi quando si testano i modelli è meglio utilizzare build_stubbedper prestazioni migliori. Per saperne di più qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.