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