在factory_girl中填充与子项的关联

Cra*_*ker 42 ruby unit-testing factory ruby-on-rails factory-bot

我有一个模型Foohas_many'Bar'.我为每个对象都有一个factory_girl工厂.Bar的工厂与Foo有关联; 它会在创建Bar时实例化Foo.

我想要一个创建包含Bar的Foo的Factory.理想情况下,这个Bar将通过:bar工厂创建,并尊重用于创建Foo的构建策略(create/build).

我知道我可以调用:bar工厂,然后从新的Bar中获取Foo引用.我想避免这种情况; 在我的测试用例中,重要的对象是Foo; 称酒吧工厂似乎有点迂回曲折.此外,我可以看到需要一个有多个条形的Foo.

这在Factory_girl有可能吗?你如何在父母中定义这种关系?

Cra*_*ker 50

Factory.after_ hooks似乎成功地做到这一点的唯一方法.我找到了一种方法来维护构建策略而不重复代码:

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
Run Code Online (Sandbox Code Playgroud)

文件指出,after_build将之前被调用after_create,如果:create使用构造策略.如果:build使用,则只after_build调用,每个人都很高兴.

我还在这个要点上创建了一个抽象的通用版本,以保持干燥.

  • 完美 - 一直在撕裂我的头发.谢谢! (2认同)
  • 很难相信这是最好的方法,但似乎仍然如此.向这个答案投票. (2认同)