Próbuję wprowadzić fałszywe dane do fabryki za pomocą klejnotu Fakera:
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
Jednak chociaż spodziewam się, że spowoduje to utworzenie użytkowników, którzy mają różne imię i nazwisko, każdy z nich jest taki sam:
>> 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">
Jak mogę sprawić, by klejnot Fakera generował nowe nazwy dla każdego użytkownika, a nie tylko ponownie używał oryginalnych?
ruby-on-rails
factory-bot
Peter Nixey
źródło
źródło
user.sequence(:first_name} {|n| Faker::Name::first_name}
? FactoryGirl prawdopodobnie właśnie ocenia wywołanie Fakera, gdy ładuje Twoje „urządzenia”. Zastosowanie tejsequence param,&block
metody powinno temu zapobiec.Odpowiedzi:
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
Spróbuj umieścić nawiasy wokół oszustów. zobacz ten link
źródło
Pamiętaj, że Faker może nadal dostarczać zduplikowane dane ze względu na ograniczoną liczbę dostępnych fałszywych danych.
Do prostych celów testowych i walidacji unikalności użyłem:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"} sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
źródło
W celu zachowania poprawnej odpowiedzi, tutaj została przeniesiona z bloga, nie przypisuję sobie zasługi.
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
Aby wyjaśnić, dlaczego, pierwszy przykład przedstawia te same nazwy. Ocenia się tylko raz. Drugi przykład ocenia za każdym razem, gdy używana jest fabryka.
Wynika to z
{}
leniwej oceny. Zasadniczo dostarczają proc / lambda z wywołaniem Fakera jako wartością zwracaną.źródło
(Mniej wydajną) alternatywą dla używania sekwencji, gdy masz walidację unikalności atrybutu, jest sprawdzenie, czy proponowana wartość już istnieje i próbowanie nowych, aż będzie unikalna:
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
źródło