42

Foohas_many'Bar'のモデルがあります。これらのオブジェクトごとにfactory_girlファクトリがあります。BarのファクトリーはFooと関連があります。バーを作成するときにFooをインスタンス化します。

バーを含むFooを作成するファクトリが欲しいのですが。理想的には、このバーは:barファクトリを介して作成され、Fooの作成に使用されるビルド戦略(create / build)を尊重します。

:barファクトリを呼び出して、新しいBarからFooリファレンスを取得できることはわかっています。これは避けたいです。私のテストケースでは、重要なオブジェクトはFooです。バーファクトリーに電話するのは少し遠回りのようです。また、複数のバーを備えたFooの必要性もわかります。

これはfactory_girlで可能ですか?親でこの関係をどのように定義しますか?

4

5 に答える 5

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

ドキュメントには、ビルド戦略が使用される場合にafter_build以前に呼び出されることが記載されています。使用されている場合は、のみが呼び出され、誰もが幸せです。after_create:create:buildafter_build

私はまた、物事を乾いた状態に保つために、この要点で抽象化された一般的に適用可能なバージョンを作成しました。

于 2010-06-13T18:45:54.700 に答える
4

associationこの方法は、次の両方の方法で使用できます。

Factory.define :foo do |f|
  # ...
  f.association :bar
end

それが機能しない場合は、コールバックを使用して手動で関連付けることができます。これが私のアプリの1つからの例です:

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
于 2010-05-30T19:52:53.060 に答える
3

FactoryGirl:method => :buildに、関連付けで使用できるオプションが追加されました。これにより、関連付けられたオブジェクトを作成するのではなく作成します。

#64:オブジェクトを作成すると関連付けが作成されます

于 2011-11-12T14:44:20.547 に答える
3

FactoryGirl 4.3.0は、親オブジェクトsave!を呼び出すときにアソシエーションを呼び出しbuildていますが、これは正しい動作を意図したものではないと思います。

FactoryGirlコードを掘り下げた後strategy: :build、ファクトリのアソシエーション定義に追加すると、を呼び出さずにアソシエーションを作成しているように見えますsave!

于 2013-12-29T08:16:55.410 に答える
2

を使用factory_girl-4.5.0して、親オブジェクトファクトリにn個の子オブジェクトを作成します

FactoryGirl.define do
  factory :foo do
    name "test"        

    after(:build) do |instance|
      n.times { instance.bars << FactoryGirl.create(:bar) }          
    end
  end
end
于 2015-04-15T13:29:33.900 に答える