FactoryBotの利用方法チートシート

factory_bot 6.5.0、factory_bot_rails 6.4.4で確認。

定義方法はFactoryBotの定義チートシートを参照。

メソッド

buildメソッドはインスタンスを保存せずにFactoryBotの定義に基づいてインスタンス化する。定義の書き方が悪かったり、古い挙動を維持するFactoryBot.use_parent_strategy = falseを設定していたりすると部分的、あるいは全部が保存されることがある。

createメソッドはbuildメソッドを実行した上で保存もする。バリデーションエラーになれば当然保存されない。

attributes_forメソッドはFactoryBotの定義に基づいたハッシュを返す。ActiveRecordのattriutesメソッドに似ているが、attributes_forはFactoryBotの定義ファイルにないカラムは返さないし、アソシエーションもアソシエーション名がキーで値がnilという形で追加される。

build_stubbedメソッドはidやcreated_at、updated_atなど保存されたら埋まるカラムを見かけ上埋めるbuildメソッドで、実際には保存されない。

*_listメソッドは第二引数に個数を指定することで、一度に複数のインスタンスを作成できるメソッド。例:build_list(:user, 10)

*_pairメソッドは*_list(:factory, 2)のショートハンド。

属性のオーバーライド、アソシエーションのオーバーライド

buildメソッドなどには、キーワード引数を指定することで、FactoryBotの定義を上書きできる。

build(:user, name: 'saito')

アソシエーションも同様に上書きできる。

build(:book, author: build(:author))

トレイトの指定

トレイトの指定もできる。

build(:user, :admin_trait, :trait2, name: 'saito')
# *_listメソッドの第二引数は個数で固定なので注意
build_list(:factory, 2, :trait, attribute: 'value')

buildメソッドなどのブロック

tapメソッドを使うと以下のような初期化の仕方ができる。

let(:user) do
  build(:user).tap do |user|
    # FactoryBotで定義できるがあくまで例
    user.email = "#{user.name}@example.com"
  end
end

しかし、実はtapメソッドの呼び出しを省略しても同じ結果になる。

let(:user) do
  build(:user) do |user|
    # FactoryBotで定義できるがあくまで例
    user.email = "#{user.name}@example.com"
  end
end