独自の戦略

独自の構築の戦略を加えてfactory_botの挙動を拡張したいときがあります。

戦略は2つのメソッドassociation及びresultを定義します。 associationFactoryBot::FactoryRunnerインスタンスを受け取ります。 このインスタンスはrunを呼んでお好みで戦略を上塗りできます。 2つ目のメソッドresultFactoryBot::Evaluationインスタンスを受け取ります。 コールバック、objecthash(結果のインスタンスやファクトリで定義された属性に基づくハッシュを得るためのもの)、createのきっかけとなる手段を(notifyで)を提供します。 createはファクトリで定義されたto_createコールバックを実行します。

factory_botで、戦略が内部で使われる仕組みを理解するには、4つの既定の戦略それぞれのソースを眺めるのが、恐らく一番簡単です。

以下はFactoryBot::Strategy::Createを使ってモデルにJSON表現を構築する戦略を組む例です。

class JsonStrategy
  def initialize
    @strategy = FactoryBot.strategy_by_name(:create).new
  end

  delegate :association, to: :@strategy

  def result(evaluation)
    @strategy.result(evaluation).to_json
  end

  def to_sym
    :json
  end
end

factory_botに新しい戦略を認識させるために、その戦略を登録できます。

FactoryBot.register_strategy(:json, JsonStrategy)

こうして呼べるようになります。

FactoryBot.json(:user)

最後に、戦略の代わりに新しいオブジェクトと登録することによってfactory_bot独自の戦略を上塗りできます。