在factory_girl中填充与小孩的关联
我有一个has_many'Bar'的Foo
模型。 我有一个factory_girl工厂为每个这些对象。 Bar的工厂有一个Foo的协会; 它会在创buildBar时实例化一个Foo。
我想要一个创build一个包含一个Bar的Foo的工厂。 理想情况下,这个Bar将通过:bar工厂创build,并且尊重用于创buildFoo的构build策略(创build/构build)。
我知道我可以调用:bar工厂,然后从新Bar中获取Foo引用。 我想避免这个; 在我的testing案例中,重要的对象是Foo; 打电话给Bar工厂似乎有点迂回。 另外,我可以看到有多个酒吧的Foo的需要。
这可能在factory_girl? 你如何在家长中定义这种关系?
Factory.after_ hooks
似乎是成功完成这一任务的唯一方法。 我已经想出了一个维护构build策略而不重复代码的方法:
Factory.define :foo do |f| f.name "A Foo" f.after(:build) { |foo| foo.bars << Factory.build(:bar, :foo => foo) } f.after(:create) { |foo| foo.bars.each { |bar| bar.save! } } end
该文档指出,如果使用:create
build策略, after_build
将在after_create
之前被调用。 如果使用:build
,那么只有after_build
被调用,并且每个人都很高兴。
我还在这个要点上创build了一个通用的抽象版本,以保持干燥。
您可以使用association
方法两种方式:
Factory.define :foo do |f| # ... f.association :bar end
如果这不起作用,您可以使用callback手动关联它们。 以下是我的一个应用程序示例:
Factory.define :live_raid do |raid| end Factory.define :live_raid_with_attendee, :parent => :live_raid do |raid| raid.after_create { |r| Factory(:live_attendee, :live_raid => r) } end
FactoryGirl现在有一个:method => :build
选项,你可以在关联上使用,这将build立关联的对象而不是创build它。
#64:build立一个对象创build关联
FactoryGirl 4.3.0正在调用save!
在关联父对象上调用build
时,我认为这不是正确的行为。
在挖掘FactoryGirl代码之后,向工厂中的关联定义添加strategy: :build
似乎现在正在创build我的关联而不调用save!
。
使用factory_girl-4.5.0
,在父对象工厂中创buildn个子对象
FactoryGirl.define do factory :foo do name "test" after(:build) do |instance| n.times { instance.bars << FactoryGirl.create(:bar) } end end end