工厂女孩协会

时间:2011-08-11 10:36:05

标签: ruby-on-rails ruby factory-bot

我写了一个rspec测试,它在我的专栏中添加了一些单元。

我有两个型号=>专栏和单位。 Rubric有很多单位。 它看起来像这样:

@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 个答案:

答案 0 :(得分:6)

你有一个循环引用。创建text_unit时,会创建关联的common_rubric_with_unitcommon_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 :(得分:1)

所有问题都是模型中表的默认名称。 并在阅读后 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