J'essaie de remplir de fausses données dans une usine à l'aide du gem Faker:
Factory.define :user do |user|
user.first_name Faker::Name::first_name
user.last_name Faker::Name::last_name
user.sequence(:email) {|n| "user#{n}@blow.com" }
end
Cependant, même si je m'attends à ce que cela produise des utilisateurs qui ont des prénoms et des noms de famille différents, chacun est le même:
>> Factory(:user)
=> #<User id: 16, email: "[email protected]", created_at: "2011-03-18 18:29:33",
updated_at: "2011-03-18 18:29:33", first_name: "Bailey", last_name: "Durgan">
>> Factory(:user)
=> #<User id: 17, email: "[email protected]", created_at: "2011-03-18 18:29:39",
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">
Comment puis-je faire en sorte que la gemme Faker génère de nouveaux noms pour chaque utilisateur et pas seulement réutiliser les originaux?
ruby-on-rails
factory-bot
Peter Nixey
la source
la source
user.sequence(:first_name} {|n| Faker::Name::first_name}
? FactoryGirl évalue probablement simplement votre appel Faker quand il charge vos "projecteurs". L'utilisation de lasequence param,&block
méthode devrait empêcher cela.Réponses:
Factory.define :user do |user| user.first_name { Faker::Name::first_name } user.last_name { Faker::Name::last_name } user.sequence(:email) {|n| "user#{n}@blow.com" } end
Essayez de mettre des crochets autour des faux. voir ce lien
la source
Notez que Faker peut toujours fournir des données en double en raison de la quantité limitée de fausses données disponibles.
À des fins de test simples et pour obtenir des validations d'unicité, j'ai utilisé ce qui suit:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"} sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
la source
Dans un souci de préserver la bonne réponse, ici elle est transférée du blog, je ne prends aucun crédit pour la réponse.
Factory.define :user do |u| u.first_name Faker::Name.first_name u.last_name Faker::Name.last_name end
Factory.define :user do |u| u.first_name { Faker::Name.first_name } u.last_name { Faker::Name.last_name } end
Pour expliquer pourquoi, le premier exemple produit les mêmes noms. Il n'évalue qu'une seule fois. Le deuxième exemple évalue chaque fois que l'usine est utilisée.
Cela est dû à la
{}
fourniture d'une évaluation paresseuse. Ils fournissent essentiellement un proc / lambda avec l'appel Faker comme valeur de retour.la source
Une alternative (moins efficace) à l'utilisation de séquences lorsque vous avez une validation d'unicité sur un attribut est de vérifier si une valeur proposée existe déjà et de continuer à en essayer de nouvelles jusqu'à ce qu'elle soit unique:
FactoryGirl.define do factory :company do name do loop do possible_name = Faker::Company.name break possible_name unless Company.exists?(name: possible_name) end end end end
la source