Я пытаюсь заполнить фабрику фальшивыми данными с помощью драгоценного камня 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
Однако, хотя я ожидаю, что это приведет к появлению пользователей с разными именами first_name и last_name, все они одинаковы:
>> Factory(:user)
=> #<User id: 16, email: "user7@blow.com", 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: "user8@blow.com", created_at: "2011-03-18 18:29:39",
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">
Как я могу заставить гем Faker генерировать новые имена для каждого пользователя, а не просто повторно использовать оригинальные?
ruby-on-rails
factory-bot
Питер Никси
источник
источник
user.sequence(:first_name} {|n| Faker::Name::first_name}
? FactoryGirl, скорее всего, просто оценивает ваш вызов Faker, когда загружает ваши «приспособления». Использованиеsequence param,&block
метода должно предотвратить это.Ответы:
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
Попробуйте заключить фейков в скобки. см. эту ссылку
источник
Обратите внимание, что Faker может по-прежнему предоставлять повторяющиеся данные из-за ограниченного количества доступных поддельных данных.
Для простых целей тестирования и проверки уникальности я использовал следующее:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"} sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
источник
Чтобы сохранить правильный ответ, здесь он перенесен из блога, я не беру на себя ответственность за ответ.
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
Чтобы объяснить, почему, в первом примере используются те же имена. Это только оценка один раз. Во втором примере выполняется оценка каждый раз, когда используется фабрика.
Это происходит из-за
{}
ленивой оценки. По сути, они предоставляют proc / lambda с вызовом Faker в качестве возвращаемого значения.источник
Менее эффективная альтернатива использованию последовательностей, когда у вас есть проверка уникальности атрибута, - это проверить, существует ли уже предлагаемое значение, и продолжать пробовать новые, пока не станет уникальным:
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
источник