L'introduction de Factory Girl fait la différence entre FactoryGirl.build()
et FactoryGirl.create()
:
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
Je ne comprends toujours pas les différences pratiques entre les deux. Quelqu'un peut-il donner un exemple où vous voudriez utiliser l'un et pas l'autre? Merci!
la source
create
parbuild
et l'annuler si le test échoue?#create
et renvoie- t- il l'objet persistant à partir du disque ou renvoie-t-il l'objet qui est en mémoire après l'avoir conservé? En d'autres termes, est-ce que faire estcreate(...)
équivalent àcreate(...).reload
?L'utilisation
FactoryGirl.build(:factory_name)
ne persiste pas dans la base de données et n'appelle passave!
, donc vos validations Active Record ne s'exécuteront pas. C'est beaucoup plus rapide, mais les validations peuvent être importantes.L'utilisation
FactoryGirl.create(:factory_name)
persistera dans la base de données et appellera les validations d'enregistrement actif. Ceci est évidemment plus lent mais peut attraper des erreurs de validation (si vous vous en souciez dans vos tests).la source
FactoryGirl.create()
créera un nouvel objet et des associations (si la fabrique en a) pour lui. Ils seront tous conservés dans une base de données. En outre, il déclenchera les validations du modèle et de la base de données. Rappelsafter(:build)
etafter(:create)
seront appelés après la sauvegarde de l'usine. Sera égalementbefore(:create)
appelé avant la sauvegarde de l'usine.FactoryGirl.build()
ne sauvera pas un objet, mais fera toujours des requêtes à une base de données si la fabrique a des associations. Il déclenchera des validations uniquement pour les objets associés. Le rappelafter(:build)
sera appelé après la construction de l'usine.Notez que dans la plupart des cas, lorsque vous testez des modèles, il est préférable d'utiliser
build_stubbed
pour de meilleures performances. En savoir plus ici .la source