【Rails6】 RSpec에 의한 투고시의 모델 단체 테스트의 구현

소개



서비스 품질을 유지하기 위해 필수적인 테스트를 실시하고 있습니다.
이번은 투고시의 모델(Definition 모델) 단체 테스트를 실시해, 그 내용을 기사로 했습니다.
향후 다른 모델에 대해서도 실시해 기사로 해 가고 싶습니다.

또 테스트는 추가로 실시해 가기 때문에, 향후도 투고시의 모델 단체 테스트의 내용을 추가해 갑니다.

전제



· 다음 gem은 설치됨
  gem 'rspec-rails', '~> 4.0.0'
  gem 'factory_bot_rails'
  gem 'faker'

・투고 기능 실장 완료

버전



루비 버전 ruby-2.6.5
Rails 버전 Rails:6.0.0
rspec-rails 4.0.0

실시한 테스트





정의 테이블의 열 소개



xxx_create_definitions.rb
class CreateDefinitions < ActiveRecord::Migration[6.0]
  def change
    create_table :definitions do |t|
      t.text       :title,          null: false
      t.text       :body,           null: false
      t.references :user,           foreign_key: true
      t.timestamps
    end
  end
end




모델 내 어소시에이션 및 검증



app/models/definition.rb
class Definition < ApplicationRecord
  belongs_to :user
  has_many :answers, dependent: :destroy
  has_many :reviews, dependent: :destroy
  has_many :notifications, dependent: :destroy
  has_many :likes, dependent: :destroy

  validates :title, presence: true
  validates :body, presence: true

# 〜省略〜

FactoryBot의 내역



spec/factories/definitions.rb
FactoryBot.define do
  factory :definition do
    title                        {Faker::Lorem.sentence}
    body                         {Faker::Lorem.sentence}
    association :user
  end
end

테스트 코드 내용



spec/models/definition_spec.rb
require 'rails_helper'

RSpec.describe Definition, type: :model do
  before do
    @definition = FactoryBot.build(:definition)
  end

  describe '投稿' do
    context '投稿がうまくいくとき' do
      it "内容に問題ない場合" do
        expect(@definition).to be_valid
      end
      it "正しく保存できるか" do
        expect(FactoryBot.build(:definition)).to be_valid
      end
    end

    context '投稿が上手くいかないとき' do
      it "titleが空だと登録できない" do
        @definition.title = ''
        @definition.valid?
        expect(@definition.errors.full_messages).to include("Titleを入力してください")
      end
      it "bodyが空だと登録できない" do
        @definition.body = ''
        @definition.valid?
        expect(@definition.errors.full_messages).to include("Bodyを入力してください")
      end
     end
  end


  describe "各モデルとのアソシエーション" do
    let(:association) do
      described_class.reflect_on_association(target)
    end
    let(:definition) { FactoryBot.create(:definition) }

    context "Likeモデルとのアソシエーション" do
      let(:target) { :likes }
      it "Likeとの関連付けはhas_manyであること" do
        expect(association.macro).to eq :has_many
      end

      it "Defintionが削除されたらLikeも削除されること" do
        like = FactoryBot.create(:like, definition_id: definition.id)
        expect { definition.destroy }.to change(Like, :count).by(-1)
      end
    end

    context "Answerモデルとのアソシエーション" do
      let(:target) { :answers }
      it "Answerとの関連付けはhas_manyであること" do
        expect(association.macro).to eq :has_many
      end

      it "Definitionが削除されたらAnswerも削除されること" do
        answer = FactoryBot.create(:answer, definition_id: definition.id)
        expect { definition.destroy }.to change(Answer, :count).by(-1)
      end
    end
  end
end

이상입니다.

좋은 웹페이지 즐겨찾기