フック

factory定義ブロックやFactoryBot.defineブロック内部では、afterメソッドやbeforeメソッドやcallbackメソッドが使えます。 これにより構築戦略の一部にフックを掛けられます。

factory定義ブロック内では、これらのコールバックはそのファクトリのみのスコープとなります。 FactoryBot.defineブロック内では、全てのファクトリに対して大域的になります。

callback

callbackメソッドでは、任意のfactory_botのコールバックに名前でフックを掛けられます。 構築戦略の便覧に見られる通り、予め定義された名前はbefore_allafter_buildbefore_createafter_createafter_stubafter_allです。

このメソッドはスプラットされる名前とブロックを取ります。 名前のどれかが活性になる度にブロックが呼ばれます。 ブロックは#to_procに応答する任意のものにできます。

このブロックは2つの実引数を取ります。 1つはファクトリのインスタンスで、もう1つはfactory_botの文脈です。 文脈はtransient属性を持ちます。

同じコールバック名を複数回フックに掛けられます。 ブロックは全て、定義された順に実行されます。 コールバックは親から継承します。 親のコールバックがまず実行されます。

afterメソッドとbeforeメソッド

afterメソッドとbeforeメソッドはcallbackにいい感じの構文を加えています。

after(:create) do |user, context|
  user.post_first_article(context.article)
end

callback(:after_create) do |user, context|
  user.post_first_article(context.article)
end