FactoryGirl - Как создать иерархию записей категорий в базе данных перед запуском тестов? - PullRequest
1 голос
/ 12 января 2012

Я создаю веб-сайт электронной коммерции, ядром которого является модуль каталога - он содержит около 20 категорий, каждая из которых имеет от 5 до 30 подкатегорий, затем продукты связываются с подкатегориями.

Я пытаюсьчтобы понять, как создать родительскую категорию, а затем, по крайней мере, 2 подкатегории, которые связаны с одним и тем же родителем с помощью FactoryGirl.

Вот что у меня есть:

Factory.define :parent_category do |f|
  f.name "MetalWork"
end

Factory.define :child_category do |f|
  f.name "Wedling"
  f.association :parent_category
  f.metatitle ""
  f.metadescription ""
end

Ядумая об использовании последовательности для генерации имени дочерней категории и данных SEO, однако, если я затем сгенерирую 2 модели child_category, используя:

FactoryGirl.build_list(:child_category, 2)

, это создаст две отдельные родительские категории, а это не то, что мне нужно.

Важно, чтобы было как минимум две дочерние категории, потому что мы должны обеспечить, чтобы различные SEO-данные, сохраняемые с помощью моделей дочерних категорий, отображались на правильных страницах.

Кто-нибудь знает, каквыполнить это?Я знаю, что это, вероятно, очень новый вопрос, спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 12 января 2012

Вы можете передать хеш любому вызову фабрики, чтобы переопределить любой из атрибутов - это относится и к вызову build_list:

parent = Factory(:category, :name => "Test Category")
FactoryGirl.build_list(:child_category, 2, :parent_category => parent)

См. Примеры в разделе «Создание и создание нескольких записей» в документах .

0 голосов
/ 12 января 2012

Я бы начал с чего-то вроде

# spec/support/factories.rb
FactoryGirl.define do
  factory :parent_category do
    name 'MetalWork'
  end

  factory :child_category do
    name 'Wedling'
    metatitle ''
    metadescription ''
  end
end

# some_controller_spec.rb
before :each do
  @parent = Factory :parent_directory
  (5 + rand(26)).times do
    # replace :parent_id with whatever attribute
    # you have to store parent category
    @child = Factory :child_directory, :parent_id => @parent.id
    # next you can fabricate your products with :category => @child
    # ...
  end
end
...