RSpec에서 let_it_be를 사용하여 생성되는 레코드 수를 줄입니다.

6724 단어 RSpec루비Rails

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 'test-prof'를 Gemfile에 추가하고 bundle installrails_helper.rbrequire 'test_prof/recipes/rspec/let_it_be' 추가

이전 테스트 파일에서
let!(:book) { create(:book) }
let!
let_it_be(:book) { create(:book) }
let_it_be 로 바꾸는 것만

이제 테스트를 실행하려고하면 한 번만 콜백이라고합니다.



소감



테스트가 느려지지 않으려고 노력하고 싶었습니다.

이상입니다.
읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기