【问题标题】:FactoryGirl create_list pass in multiple valuesFactoryGirl create_list 传入多个值
【发布时间】:2015-07-14 07:24:23
【问题描述】:

如果我有这个工厂:

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 的特征和忽略块)。我希望这是有道理的。我可以在这里展示一堆代码,但我相信这提供了足够的上下文?

【问题讨论】:

    标签: ruby factory-bot


    【解决方案1】:

    您可以自己生成列表:

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

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

    【讨论】:

      【解决方案2】:

      由于v5.2.0 你可以这样做:

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

      【讨论】:

        【解决方案3】:

        我发现这个线程正在寻找类似的解决方案。如果您实际上只是想像示例一样对名称进行排序,则可以在工厂中使用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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多