Estoy tratando de ingresar 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 nombres y apellidos, 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 hacer que la gema Faker genere nuevos nombres para cada usuario y no solo reutilice los originales?
ruby-on-rails
factory-bot
Peter Nixey
fuente
fuente
user.sequence(:first_name} {|n| Faker::Name::first_name}
? Es probable que FactoryGirl solo esté evaluando su llamada de Faker cuando carga sus "accesorios". Usar elsequence param,&block
método debería prevenir eso.Respuestas:
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
Intente poner paréntesis alrededor de los falsificadores. ver este enlace
fuente
Tenga en cuenta que Faker puede seguir proporcionando datos duplicados debido a la cantidad limitada de datos falsos disponibles.
Para propósitos de prueba simples y para obtener validaciones de unicidad, he usado lo siguiente:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"} sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
fuente
En aras de preservar la respuesta correcta, aquí se translocó del blog, no me atribuyo el mérito de la respuesta.
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
Para explicar por qué, el primer ejemplo produce los mismos nombres. Solo se evalúa una vez. El segundo ejemplo evalúa cada vez que se usa la fábrica.
Esto se debe a que
{}
proporciona una evaluación perezosa. Básicamente, están proporcionando un proc / lambda con la llamada Faker como valor de retorno.fuente
Una alternativa (menos eficiente) al uso de secuencias cuando tiene una validación de unicidad en un atributo es verificar si un valor propuesto ya existe y seguir probando otros 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
fuente