【Rails6】 RSpec에 의한 Like의 모델 단위 테스트의 구현

소개



서비스 품질을 유지하기 위해 필수적인 테스트를 실시하고 있습니다.
이번은 Like 모델편이라고 하는 것으로, 향후 다른 모델에 대해서도 실시해 기사로 해 가고 싶습니다.

전제



· 다음 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

실시한 테스트





likes 테이블의 열 소개



xxx_create_likes.rb
class CreateLikes < ActiveRecord::Migration[6.0]
  def change
    create_table :likes do |t|
      t.references :user,       foreign_key: true
      t.references :answer,     foreign_key: true
      t.references :definition,     foreign_key: true
      t.timestamps
    end
  end
end



모델의 유효성 검사



app/models/like.rb
class Like < ApplicationRecord
  belongs_to :user
  belongs_to :answer
  belongs_to :definition

  validates :user_id, presence: true
  validates :answer_id, uniqueness: { scope: :user_id }, presence: true
  validates :definition_id, uniqueness: { scope: :user_id }, presence: true
end


FactoryBot의 내역



spec/factories/likes.rb
FactoryBot.define do
  factory :like do
    association :answer
    association :definition
    user { answer.user }
  end
end


테스트 코드 내용



spec/models/like_spec.rb

require 'rails_helper'

RSpec.describe Like, type: :model do
  before do
    @like = FactoryBot.build(:like)
  end
  describe '正常値と異常値の確認' do
    context 'likeモデルのバリデーション' do
      it "user_idとanswer_id、definition_idがあれば保存できる" do
        expect(FactoryBot.create(:like)).to be_valid
      end

      it "user_idがなければ無効な状態であること" do
        @like.user_id = nil
        @like.valid?
        expect(@like.errors[:user_id]).to include("を入力してください")
      end

      it "answer_idがなければ無効な状態であること" do
        @like.answer_id = nil
        @like.valid?
        expect(@like.errors[:answer_id]).to include("を入力してください")
      end

      it "definition_idがなければ無効な状態であること" do
        @like.definition_id = nil
        @like.valid?
        expect(@like.errors[:definition_id]).to include("を入力してください")
      end

      it "answer_idが同じでもuser_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, answer_id: like.answer_id)).to be_valid
      end

      it "definition_idが同じでもuser_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, definition_id: like.definition_id)).to be_valid
      end

      it "user_idが同じでもanswer_idが違うと保存できる" do
        like = FactoryBot.create(:like)
        expect(FactoryBot.create(:like, user_id: like.user_id)).to be_valid
      end
    end
  end
end

보충 설명



Factorybot의 asociation 메소드 정보



객체 (user 객체, answer 객체, definition 객체)를 서로 연결하는 데 사용됩니다.

예)
아래와 같이 answer 객체에 대한 설명을 하기 위해서는 user 객체에 대한 정보를 기술해야 합니다.

like_spec.rb
user = FactoryBot.create(:user)
answer = FactoryBot.create(:answer, user: user)

association 메소드를 사용하는 것으로, 오브젝트끼리의 관련짓을 할 수 있으므로, 이하와 같이 1행으로의 기술로 끝낼 수가 있습니다.

like_spec.rb
answer = FactoryBot.create(:answer)

Factorybot user { answer.user } 정보



자세한 것은 이하 URL보다.
htps : // 코 m / 료가 _ 아오 ym / ms / 741c57 에 266 9d811 2d4

이상입니다.

좋은 웹페이지 즐겨찾기