Ответ 1
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
Попробуйте положить скобки вокруг подделок. см. эта ссылка
Я пытаюсь заполнить некоторые поддельные данные в factory, используя камень 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_names, каждый из них будет одним и тем же:
>> 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">
Как я могу заставить камень 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
Попробуйте положить скобки вокруг подделок. см. эта ссылка
Обратите внимание, что Faker по-прежнему может предоставлять повторяющиеся данные из-за ограниченного количества доступных поддельных данных.
Для простых целей тестирования и для получения уникальных проверок я использовал следующее:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
Чтобы сохранить правильный ответ, здесь он транслируется из блога, я не беру на себя ответственность за ответ.
Если вы используете приведенный ниже код, faker не будет генерировать уникальные имена
Factory.define :user do |u|
u.first_name Faker::Name.first_name
u.last_name Faker::Name.last_name
end
Однако создание фигурных скобок вокруг faker делает работу!
Factory.define :user do |u|
u.first_name { Faker::Name.first_name }
u.last_name { Faker::Name.last_name }
end
Чтобы объяснить, почему в первом примере производятся одни и те же имена. Он оценивает только один раз. Второй пример оценивается каждый раз, когда используется factory.
Это связано с тем, что {}
обеспечивает ленивую оценку. По сути, они предоставляют proc/lambda вызов Faker как возвращаемое значение.
A (менее эффективная) альтернатива использованию последовательностей, когда вы проверяете уникальность атрибута, заключается в проверке того, существует ли предлагаемое значение и продолжать попытки новых, пока он не станет уникальным:
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