在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