RSpecでlet_it_beを使って、作成されるレコード数を減らす


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

コールバックが3回呼ばれています

レコード生成回数を減らしたい!

let_it_beという存在を知りました
gemのリポジトリ

セットアップ

gem 'test-prof' をGemfileに追加し、bundle install

rails_helper.rbrequire 'test_prof/recipes/rspec/let_it_be'を追加

先ほどのテストファイルで

let!(:book) { create(:book) }

let!

let_it_be(:book) { create(:book) }

let_it_beに変えるだけ

これでテスト走らせてみると、1度しかコールバック呼ばれていない

所感

テストが遅くならないようちりつもでやっていきたいと思いました

以上です。
読んでいただき、ありがとうございます。