let_it_beを使うと作成されるレコード数を減らすことができる
解説
こういうbooksテーブルがあるとする
create_table "books", force: :cascade do |t|
t.string "title"
t.string "description"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
factoryを用意します
FactoryBot.define do
factory :book do
title { 'hoge' }
description { 'fuga' }
end
end
こんな感じのテストがあるとします
RSpec.describe do
describe 'Book' do
let!(:book) { create(:book) }
it 'test 1' do
expect(book.title).to eq('hoge')
expect(Book.count).to eq(1)
end
it 'test 2' do
expect(book.title).to eq('hoge')
expect(Book.count).to eq(1)
end
it 'test 3' do
expect(book.title).to eq('hoge')
expect(Book.count).to eq(1)
end
end
end
上のテストを実行することで、計3回レコードが生成されます
検証のため、
Bookモデルにafter_saveコールバックを設定してテストを走らせてみます
class Book < ApplicationRecord
after_save :check_create
private
def check_create
p 'created!'
end
end
レコード生成回数を減らしたい!
let_it_beという存在を知りました
gemのリポジトリ
セットアップ
gem 'test-prof'
をGemfileに追加し、bundle install
rails_helper.rb
にrequire 'test_prof/recipes/rspec/let_it_be'
を追加
先ほどのテストファイルで
let!(:book) { create(:book) }
のlet!
を
let_it_be(:book) { create(:book) }
let_it_be
に変えるだけ
これでテスト走らせてみると、1度しかコールバック呼ばれていない
所感
テストが遅くならないようちりつもでやっていきたいと思いました
以上です。
読んでいただき、ありがとうございます。