FactoryBot
gem "factory_bot_rails"
RSpecでテストデータ作成をサポートするgem
柔軟に記述できるため、Rails標準のfixturesの代替として人気
rails g factory_bot:model モデル名
createはFactoryBot.create(:モデル名)
create(:target, amount: 100, name: "hiroki")みたいに引数を指定した場合はfactorybot内の属性が上書きされる
rails_helper.rbに以下の設定を書き加えると省略形で書くことが出来る
code:ruby
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
code:ruby
FactoryBot.define do
factory :user do
name { Faker::Name.name }
email { Faker::Internet.email }
end
end
buidlとcreateの違い
buid
new
DB上にはデータがないのでDBアクセスする必要があるテストでは使えない
create
new+save
DBにインスタンスを永続化する
createはdbに保存するためdbアクセスが発生する
不必要なcreateを減らしてbuildに変えれば単体テスト早くなる
buildとbuild_stubbedの違い
build
メモリ上に生成しますが、データベースには保存しない
生成されたオブジェクトは、データベースに記録されていないため、データベースのIDなど、データベースに依存する属性は持たない
しかし、buildで生成されたオブジェクトは、データベースに保存することが可能(例えば、save メソッドを呼び出すことにより)
build_stubbed
生成されたオブジェクトがデータベースに保存されているかのように振る舞う点が異なる
build_stubbed で生成されたオブジェクトは、実際にはデータベースに保存されていませんが、保存されているかのような属性(例えば、ID)を持つ
さらに、build_stubbed で生成されたオブジェクトは、Active Recordのコールバックやバリデーションをバイパスし、関連するオブジェクトもスタブされます。これにより、テストの実行速度が向上する
これらのオブジェクトは、データベースに保存することができません(実際にはデータベースに存在しないため)