【RSpec】FactoryBotのbuildとcreateの違い

buildメソッドとcreateメソッドの違い

  • テストデータの保存場所が違う

    • buildはテストデータをメモリ上に保存する
    • createはテストデータをDB上に保存する

  • userモデル(属性にname,password)があった場合

# build
user = build(:user, name: "test", password: "password")
#=> #<User id: nil, name: "test", password: "password", created_at: nil, updated_at: nil>

# create
user = create(:user, name: "test", password: "password")
#=> #<User id: 1, name: "test", password: "password", created_at: "2020-03-21 15:59:38", updated_at: "2020-03-21 15:59:38">

buildはDBにデータが保存されていないため、idや作成日時がnilになっており、createはDBに保存されているため値がセットされる

用途別の使い分け

  • DBの値を利用するテストが必要な場合にcreateを使う
    データの個数計算や一意のデータしか保存できないことなど、DBにアクセスして確認するテストにはcraeteを利用する。
    DBにアクセスする必要がないテストの場合は、テストの実行速度を上げるためにbuildを利用する。

参考