3
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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回呼ばれています
スクリーンショット 2020-04-24 0.40.42.png

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

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度しかコールバック呼ばれていない

スクリーンショット 2020-04-24 0.47.04.png

所感

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?