我正在尝试使用Faker gem将一些假数据填充到工厂中:
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: "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 gem为每个用户生成新名称,而不仅仅重用原始用户?
答案 0 :(得分:152)
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
尝试在fakers周围放置括号。见this link
答案 1 :(得分:43)
请注意,由于可用的假数据量有限,Faker可能仍在提供重复数据。
出于简单的测试目的并通过唯一性验证,我使用了以下内容:
sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}
答案 2 :(得分:17)
为了保留正确的答案,这里它是从博客中转移出来的,我不赞成这个答案。
如果您使用下面的代码,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
为了解释原因,第一个例子是生成相同的名称。它只评估一次。第二个示例在每次使用工厂时进行评估。
这是由于{}
提供了懒惰评估。基本上他们提供了一个带有Faker调用的proc / lambda作为返回值。
答案 3 :(得分:4)
当您对属性进行唯一性验证时,使用序列的一种(效率较低)替代方法是检查建议值是否已存在并继续尝试新值,直到它是唯一的:
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