Фабричное женское объединение - PullRequest
1 голос
/ 11 августа 2011

Я написал тест rspec, который добавляет в мою рубрику несколько единиц.

У меня есть две модели => Рубрика и Единицы. Рубрики имеют много единиц. Это выглядит так:

@rubric.units.push Factory :text_unit
@rubric.save

Потом я нашел factory_girl и попытался переписать этот код как заводской. Но это не работает.

Как я могу написать эту ассоциацию в Factory Girl. Я попробовал это:

  factory :common_rubric , :class => :common_info_rubric do |f|
    f.sequence(:name) {|n| "common_info_rubric#{n}"}
  end

  factory :text_unit, :class => text_info_unit do |f|
    f.association :common_rubric_with_unit
    f.sequence(:name) {|n| "text_unit#n}" }
  end

  factory :common_rubric_with_unit , :parent => :common_rubric do |f|
    f.units { |unit| unit.association(:text_info_unit) }
  end   

У меня всегда ошибка

SystemStackError:
       stack level too deep

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

У вас есть круговая ссылка там.Когда вы создаете text_unit, он создает связанный common_rubric_with_unit.Определение для common_rubric_with_unit создает связанный text_unit, и мы снова в начале.

Вам нужно удалить одну из ассоциаций с любой стороны, это должно работать:

factory :text_unit, :class => text_info_unit do |f|
  f.association :common_rubric_with_unit
  f.sequence(:name) {|n| "text_unit#n}" }
end

factory :common_rubric_with_unit , :parent => :common_rubric do |f|
end
1 голос
/ 12 августа 2011

Всей проблемой было неправильное имя таблицы в моделях. И после прочтения http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl я решаю проблему

 factory :common_rubric , :class => :common_info_rubric do |f|
    f.sequence(:name) {|n| "common_info_rubric#{n}"}
  end

  factory :text_unit, :class => :text_info_unit do |f|
    f.sequence(:name) {|n| "text_unit#{n}" }
  end

  factory :common_rubric_with_unit, :parent => :common_rubric do |f|
    f.after_create {|a| Factory(:text_unit, :rubric => a) }
  end
...