Estou tentando preencher alguns dados falsos em uma fábrica usando a 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
No entanto, embora eu espere que isso produza usuários com nomes e sobrenomes diferentes, cada um é o mesmo:
>> 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">
Como faço para que a gema Faker gere novos nomes para cada usuário e não apenas reutilize os originais?
ruby-on-rails
factory-bot
Peter Nixey
fonte
fonte
user.sequence(:first_name} {|n| Faker::Name::first_name}
? O FactoryGirl provavelmente está apenas avaliando sua chamada Faker quando carrega seus "acessórios". Usar osequence param,&block
método deve evitar isso.Respostas:
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
Tente colocar colchetes ao redor dos falsificadores. veja este link
fonte
Observe que o Faker ainda pode estar fornecendo dados duplicados devido à quantidade limitada de dados falsos disponíveis.
Para fins de teste simples e para obter validações de exclusividade, usei o seguinte:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"} sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
fonte
Para preservar a resposta correta, aqui ela foi translocada do blog, não levo nenhum crédito pela resposta.
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ê, o primeiro exemplo está produzindo os mesmos nomes. Está avaliando apenas uma vez. O segundo exemplo avalia cada vez que a fábrica é usada.
Isso se deve ao
{}
fornecimento de avaliação preguiçosa. Essencialmente, eles estão fornecendo um proc / lambda com a chamada Faker como seu valor de retorno.fonte
Uma alternativa (menos eficiente) ao uso de sequências quando você tem uma validação de exclusividade em um atributo é verificar se um valor proposto já existe e continuar tentando novos até que seja exclusivo:
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
fonte