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