address ruby-on-rails database factory-bot seeding faker

ruby on rails - address - FactoryGirl+Faker: se generan los mismos datos para cada objeto en los datos semilla de db



faker words laravel (2)

Debe pasar un bloque si desea que se vuelvan a evaluar los valores para cada instancia creada.

En lugar de

email Faker::Internet.email

tratar...

email { Faker::Internet.email }

Estoy usando FactoryGirl y Faker para generar objetos de usuario en mi archivo seeds.rb , pero por alguna razón se está creando exactamente el mismo usuario y rake db:seed está fallando debido a una validación de unicidad de correo electrónico.

Fábrica para usuarios:

#users.rb require ''faker'' FactoryGirl.define do factory :user do first_name Faker::Name.first_name last_name Faker::Name.last_name phone Faker::PhoneNumber.cell_phone email Faker::Internet.email password "password" password_confirmation "password" end end

Y el código en el archivo seeds.rb :

#seeds.rb rand(5..11).times { FactoryGirl.create(:user) }

Error:

ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

Si abro la consola y uso FactoryGirl.create(:user) obtengo los mismos resultados ... el mismo objeto se crea una y otra vez, aunque si ejecuto solo Faker::Internet.email varias veces obtendré varias e correos electrónicos

FactoryGirl:

[1] pry(main)> FactoryGirl.create(:user) ... => #<User id: 3, first_name: "Osvaldo", last_name: "Wunsch", email: "[email protected]", phone: "(912)530-4949 x64848", created_at: "2014-07-31 20:57:27", updated_at: "2014-07-31 20:57:27", encrypted_password: "$2a$10$mxWC7yLYR0m/Sw8MO6Lyru.xuTHCdCEuM9Orx3LXGApF...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil> [2] pry(main)> FactoryGirl.create(:user) ... ActiveRecord::RecordInvalid: Validation failed: Email has already been taken

Faker por sí mismo:

[3] pry(main)> Faker::Internet.email => "[email protected]" [4] pry(main)> Faker::Internet.email => "[email protected]"

¿Que me estoy perdiendo aqui? ¿Por qué Faker produce los mismos datos cada vez que lo usa FactoryGirl?


El uso de Faker para obtener atributos únicos para pasar puede ser un antipatrón. También puede ser una mala idea tener la producción semialeatoria de Faker en pruebas, ¿y si algunas veces las pruebas simplemente fallan y te encuentras en una verdadera búsqueda porque Faker tosió un valor que no esperabas?

Últimamente he estado usando las secuencias de FactoryGirl para obtener valores predecibles, pero únicos para pasar la singularidad.

FactoryGirl.define do factory :user do sequence(:first_name, 1) { |n| "John#{n}" } sequence(:last_name, 1) { |n| "Doe#{n}" } sequence(:phone, 1) { |n| (111111111+n).to_s } sequence(:email, 1) { |n| "email#{n}@example.com" } password "password" password_confirmation "password" end end FactoryGirl.create(:user).email #=> "[email protected]" FactoryGirl.create(:user).email #=> "[email protected]"

Tomado de los consejos de Factory Girl @ http://arjanvandergaag.nl/blog/factory_girl_tips.html