家长班:
class Parent < ActiveRecord::Base
has_many :kids
validates_presence_of :kids
end
儿童班:
class Kid < ActiveRecord::Base
belongs_to :parent, inverse_of: :kids
validates :parent, presence: true
end
母厂:
FactoryGirl.define do
factory :parent do
2.times do
parent.kids << FactoryGirl.create(:kid)
end
end
end
儿童工厂:
FactoryGirl.define do
factory :kid do
parent
end
end
此配置将导致无限循环。我已经尝试过FactoryGirl.build、FactoryGirl.create、after(:build)、create(:create)、关联、构建第二个虚拟工厂等的每一个组合。
写这些工厂的最好方法是什么?我犯了个愚蠢的错误吗?
似乎其他人也经历过这个问题:of.html
Ruby2.2.1,Rails 4.1.5,rspec 3.0.2,factory_girl_rails 4.4.1。
发布于 2015-05-19 14:37:12
对于我的用例,这是有效的:
母厂:
FactoryGirl.define do
factory :parent do
2.times do
parent.kids << FactoryGirl.create(:kid)
end
end
end
儿童工厂:
FactoryGirl.define do
factory :kid do
parent {Owner.new}
end
end
此模式只需向Kid工厂分配一个新的未使用的所有者对象(以通过验证)。因为父母has_many孩子和孩子可以有很多父母,所以在调用任何一个工厂时没有冲突。在您的规范中,您可以覆盖默认关联来测试所需的行为。
实际上,如果其中一个模型没有经过太多测试,您也不能为其中一个模型创建工厂;您必须为每个规范创建模型的“新”实例,如果这是常见的情况,这是不理想的。
希望这能帮到别人!
发布于 2015-05-15 19:03:13
你贴的那一页的答案其实很好,所以我在这里引用它。
你真的不能这么做。使用钩子的建议也是有限的。
如果您需要构建对象层次结构,其中对象之间存在验证规则,那么您将遇到inverse_of与belongs_to关联的问题。 如果对象层次结构完全在内存中构建,然后通过最顶层的祖先保存,ActiveRecord通常能够正确地保存对象层次结构。在某些情况下,您可以通过使用Factory.build并在工厂定义中添加after_build挂钩来设置依赖对象来模拟这种行为。这在多个层次结构中并不能很好地工作。 最后的方法是设置您自己的助手方法,并在内存中构造对象层次结构,分配依赖项,然后调用顶层父级的保存。它不像工厂调用那样优雅,但它可以帮助消除一堆设置代码的杂乱,从而绕过Factory和ActiveRecord的怪癖。
https://stackoverflow.com/questions/30271196
复制