web-dev-qa-db-fra.com

Quelle est la différence entre les méthodes de compilation et de création dans FactoryGirl?

L'introduction de Factory Girl trace 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!

87
Avery

La méthode create() conserve l'instance du modèle, tandis que la méthode build() ne la conserve que dans la mémoire.

Personnellement, j'utilise la méthode create() uniquement lorsque la persistance est vraiment nécessaire, car l'écriture dans la base de données rend les tests fastidieux.

par exemple.

Je crée des utilisateurs pour l'authentification avec create() parce que mon moteur d'authentification interroge la base de données.

Pour vérifier si un modèle a un attribut, la méthode build() le fera parce qu'aucun accès à la base de données n'est requis.

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

Mise à jour

"Il y a une exception qui construit réellement" crée "lorsque vous construisez des associations, c'est-à-dire que votre association n'est plus en mémoire mais persiste. Gardez cela à l'esprit" - Shakes

108
Helio Santos

L'utilisation de FactoryGirl.build(:factory_name) ne persiste pas dans la base de données et n'appelle pas save!. Par conséquent, vos validations Active Record ne seront pas exécutées. C'est beaucoup plus rapide, mais les validations peuvent être importantes.

L'utilisation de FactoryGirl.create(:factory_name) persistera sur la base de données et appellera les validations Active Record. Ceci est évidemment plus lent, mais peut contenir des erreurs de validation (si vous en tenez compte dans vos tests).

12
chasm

FactoryGirl.create() créera un nouvel objet et des associations (si l'usine en a) pour celui-ci. Ils seront tous conservés dans une base de données. En outre, cela déclenchera les validations du modèle et de la base de données. Les rappels after(:build) et after(:create) seront appelés après la sauvegarde de l'usine. De plus, before(:create) sera appelé avant la sauvegarde de l'usine.

FactoryGirl.build() ne sauvera pas d'objet, mais fera quand même des demandes à une base de données si la fabrique a des associations. Cela déclenchera des validations uniquement pour les objets associés. Rappel after(: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 à ce sujet ici .

1
Nesha Zoric