FactoryGirl create_list 传入多个值

FactoryGirl create_list pass in multiple values

如果我有这个工厂:

factory :product, class: Product do
  name        { Faker::Commerce.product_name }
  description { Faker::Lorem.paragraph }
  price       { Faker::Number.number(3) }
end

我可以使用 create_list 创建 2 个这样的产品:

FactoryGirl.create_list(:product, 2)

但我想将默认值传递给我的两个产品,我会假设理论上是这样的?:

prods = [{:name => "Product 1"},{:name => "Product 2"}]
FactoryGirl.create_list(:product, prods.count, prods)

我已经搜索了一段时间没有找到答案,是否可以使用像create_list这样的优雅解决方案?

我想要这个解决方案的原因是因为 :product 是父模型的许多子关联之一。我想要一种可配置的方式,我可以通过单个 FactoryGirl.create 命令生成父模型工厂,并为子关联传递我想要的所有值(通过使用 FactoryGirl 的特征和忽略块)。我希望这是有道理的。我可以在这里展示一堆代码,但我相信这提供了足够的上下文?

您可以自己生成列表:

data = [{:name => "Product 1"},{:name => "Product 2"}]
products = data.map { |p| FactoryGirl.create(:product, p) }

这应该会给您留下一系列产品。

因为 v5.2.0 你可以这样做:

twenty_somethings = create_list(:user, 10) do |user, i|
  user.date_of_birth = (20 + i).years.ago
end

我发现此线程正在寻找类似的解决方案。如果您实际上只是想像您的示例那样对名称进行排序,您可以在工厂中使用 sequence,然后使用 create_list——我发现它也可以用作特征。我的需要是在创建记录列表时增加时间戳:

trait :sequentially_longer_ago do
  sequence(:created_at) { |n| n.days.ago }
end

然后:

create_list(:my_record, 123, :sequentially_longer_ago, foo: 'bar')

所以在你的情况下,它可能是:

trait :sequence_product_name do
  sequence(:name) { |n| "Product #{n + 1}" }
end

然后:

create_list(:product, 123, :sequence_product_name, foo: 'bar')