Factorygirl创造复杂的集合

时间:2014-08-18 22:19:37

标签: ruby-on-rails factory-bot

我有一个项目和类别。我想要多个项目,每个项目都有多个类别。我不希望每个项目都有不同的类别,而是与一组共同的类别相关联。

有没有办法使用FactoryGirl dsl实现这个目的?

以下是我使用辅助模块的方法:

module Features
  module ItemsHelpers
    def create_items_with_categories
      parents = create_list :category, 2
      children = []
      5.times do
        children << (create :category, parent: parents.sample)
      end
      10.times do
        item = build :item
        item.categories << children.sample(3)
        item.save
      end
    end
  end
end

1 个答案:

答案 0 :(得分:1)

通过查看代码,我假设,item有许多类别:

sequence :name do |n|
  "Item - #{n}"
end

factory :item do
  name { generate(:name) }
  # other fields here..
  ignore do # in the latest version, it is: "transient do.."
    categories_count 5
  end

  after(:create) do |item, evaluator|
    categories { FactoryGirl.create_list(:category, evaluator.categories_count) }
  end
end

您可以将其用作:

  let(:categories) { create_list(:category, 10) }
  let(:items) { create_list(:item, 5, categories: categories) }

更新:在许多情况下,当您的规格增长时,您不必为创建categories而添加额外的items而烦恼,因为它将由默认值创建,除非指定。因此,忽略/瞬态以保持其优雅。

所以你可以这样做:

let(:items) { create_list(:items, 10, categories_count: 3) } # when you need just 3 categories per item!!

最后,它归结为您遵循的首选项和编码结构。我更喜欢同时使用这两者,以便在创建categoriesitem工厂时无需添加items列表。