我写了一个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
答案 0 :(得分:6)
你有一个循环引用。创建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 :(得分: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