name ruby-on-rails factory-bot

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