ruby on rails - name - Faker está produciendo datos duplicados cuando se usa en factory_girl
faker gemfile (4)
Intento poblar algunos datos falsos en una fábrica usando la gema 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
Sin embargo, aunque espero que esto produzca usuarios que tienen diferentes first_name y last_names, cada uno es el mismo:
>> 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">
¿Cómo puedo obtener la gema Faker para generar nuevos nombres para cada usuario y no solo reutilizar los originales?
Por el bien de preservar la respuesta correcta, aquí se transloca del blog, no me atribuyo la respuesta.
Si usas el siguiente código, faker no generará nombres únicos
Factory.define :user do |u|
u.first_name Faker::Name.first_name
u.last_name Faker::Name.last_name
end
¡Sin embargo, poner llaves alrededor de faker lo hace funcionar!
Factory.define :user do |u|
u.first_name { Faker::Name.first_name }
u.last_name { Faker::Name.last_name }
end
Para explicar por qué, el primer ejemplo produce los mismos nombres. Solo está evaluando una vez. El segundo ejemplo se evalúa cada vez que se usa la fábrica.
Esto se debe a que {}
proporciona evaluación diferida. Básicamente, están proporcionando un proc / lambda con la llamada Faker como su valor de retorno.
Tenga en cuenta que Faker todavía puede proporcionar datos duplicados debido a la cantidad limitada de datos falsos disponibles.
Para fines de prueba simple y para obtener validaciones de singularidad, he utilizado lo siguiente:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
Una alternativa (menos eficiente) al uso de secuencias cuando tienes una validación de unicidad en un atributo es verificar si ya existe un valor propuesto y seguir probando nuevos hasta que sea único:
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
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
Intenta poner corchetes alrededor de los fakers. ver este enlace