我有一个项目和类别。我想要多个项目,每个项目都有多个类别。我不希望每个项目都有不同的类别,而是与一组共同的类别相关联。
有没有办法使用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
答案 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!!
最后,它归结为您遵循的首选项和编码结构。我更喜欢同时使用这两者,以便在创建categories
或item
工厂时无需添加items
列表。