Techioz Blog

FactoryBot 特性内の関連オブジェクトを更新する

概要

サンプル工場

FactoryBot.define do
  factory :fruit do
    name { "Kiwi" }
    status { "available" }
    store { Store.first }
  end

  trait :unaccessible do
    status { "unaccessible" }
    store { status: "closed", hours_before_open: 2 }
  end
end

特性ブロック内で、関連付けられた Store オブジェクトのプロパティを更新する方法を見つけるのに苦労しています。ドキュメントの特性セクションに例が見つかりませんでした。また、ここでSOとGoogleで検索した例は見つかりませんでした。これも可能でしょうか?

解決策

次のように、トレイト内の関連付けもオーバーライドできるはずだと思います。

FactoryBot.define do
  factory :fruit do
    name { "Kiwi" }
    status { "available" }
    store # assumes a factory :store
  end

  trait :unaccessible do
    status { "unaccessible" }
    association :store, status: "closed", hours_before_open: 2
  end
end

そうすれば、作成後にストア オブジェクトを更新するために追加の DB 書き込みを行う必要がなくなります。