10

私の問題は非常に一般的なようですが、ドキュメントやインターネット自体に答えが見つかりませんでした。

これは、factory_girlのビルド戦略を尊重しながら、この質問has_manyのクローンのように見えるかもしれませんが、その投稿から2.5年後、factory_girlは大きく変化しました。

写真というhas_many関係のモデルがあります。これには、ビルド戦略の選択を維持する多くの関係があります。

私が電話する場合、私はスタブモデルのコレクションになることoffering = FactoryGirl.build_stubbed :offering, :stayを期待しています。offering.photos

これを達成するために私が見つけた唯一の方法はこれです:

factory :offering do
  association :partner, factory: :named_partner
  association :destination, factory: :geolocated_destination

  trait :stay do
    title "Hotel Gran Vía"
    description "Great hotel in a great zone with great views"
    offering_type 'stay'
    price 65
    rooms 70
    stars 4
    event_spaces 3
    photos do
      case @build_strategy
      when FactoryGirl::Strategy::Create then [FactoryGirl.create(:hotel_photo)]
      when FactoryGirl::Strategy::Build then [FactoryGirl.build(:hotel_photo)]
      when FactoryGirl::Strategy::Stub then [FactoryGirl.build_stubbed(:hotel_photo)]
      end
    end
  end
end

それを行うためのより良い方法が存在しなければならないことを言う必要はありません。

アイデア?

4

5 に答える 5

10

さまざまな FactoryGirl コールバックを使用できます。

factory :offering do
  association :partner, factory: :named_partner
  association :destination, factory: :geolocated_destination

  trait :stay do
    title "Hotel Gran Vía"
    description "Great hotel in a great zone with great views"
    offering_type 'stay'
    price 65
    rooms 70
    stars 4
    event_spaces 3
    after(:stub) do |offering|
      offering.photos = [build_stubbed(:hotel_photo)]
    end
    after(:build) do |offering|
      offering.photos = [build(:hotel_photo)]
    end
    after(:create) do |offering|
      offering.photos = [create(:hotel_photo)]
    end
  end
end
于 2012-11-15T20:35:09.170 に答える
9

Flipstoneの答えの少しきれいなバージョンは次のとおりです。

factory :offering do
  trait :stay do
    ...
    photos do
      association :hotel_photo, :strategy => @build_strategy.class
    end
  end
end
于 2013-11-08T14:34:42.377 に答える
3

FactoryRunner クラスを直接呼び出して、使用するビルド戦略を渡すこともできます。

factory :offering do
  trait :stay do
    ...
    photos do
      FactoryGirl::FactoryRunner.new(:hotel_photo, @build_strategy.class, []).run
    end
  end
end
于 2013-02-11T15:35:22.003 に答える