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
レコード生成回数を減らしたい!
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度しかコールバック呼ばれていない
所感
テストが遅くならないようちりつもでやっていきたいと思いました
以上です。
読んでいただき、ありがとうございます。
Author And Source
この問題について(RSpecでlet_it_beを使って、作成されるレコード数を減らす), 我々は、より多くの情報をここで見つけました https://qiita.com/WaiChan/items/feb665dafa47db1f46da著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .