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

소개



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

※ Relationship 모델 이외의 기술에 관해서는 생략하고 있습니다.
나중에 알림 기능에 대한 기사를 올리기 위해 그 때 자세한 내용을 올립니다.

전제



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

실시한 테스트





relationships 테이블의 열 소개



xxx_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[6.0]
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id
      t.timestamps
    end
  end
end

모델의 유효성 검사



app/models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: 'User'
  belongs_to :followed, class_name: 'User'

  validates :follower_id, presence: true, uniqueness: { scope: :followed_id }
  validates :followed_id, presence: true
end

FactoryBot의 내역



spec/factories/rerationships.rb
FactoryBot.define do
  factory :relationship do
    follower_id    { FactoryBot.create(:user).id }
    followed_id    { FactoryBot.create(:user).id }
  end
end

테스트 코드 내용



spec/models/relationship_spec.rb
require 'rails_helper'

RSpec.describe Relationship, type: :model do
  let(:relationship) { FactoryBot.create(:relationship) }
  describe '#create' do
    context "保存できる場合" do
      it "全てのパラメーターが揃っていれば保存できる" do
        expect(relationship).to be_valid
      end
    end

    context "保存できない場合" do
      it "follower_idがnilの場合は保存できない" do
        relationship.follower_id = nil
        relationship.valid?
        expect(relationship.errors[:follower_id]).to include("を入力してください")
      end

      it "followed_idがnilの場合は保存できない" do
        relationship.followed_id = nil
        relationship.valid?
        expect(relationship.errors[:followed_id]).to include("を入力してください")
      end
    end

    context "一意性の検証" do
      before do
        @relation = FactoryBot.create(:relationship)
        @user1 = FactoryBot.build(:relationship)
      end
      it "follower_idとfollowed_idの組み合わせは一意でなければ保存できない" do
        relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @relation.followed_id)
        relation2.valid?
        expect(relation2.errors[:follower_id]).to include("はすでに存在します")
      end

      it "follower_idが同じでもfollowed_idが違うなら保存できる" do
        relation2 = FactoryBot.build(:relationship, follower_id: @relation.follower_id, followed_id: @user1.followed_id)
        expect(relation2).to be_valid
      end

      it "follower_idが違うならfollowed_idが同じでも保存できる" do
        relation2 = FactoryBot.build(:relationship, follower_id: @user1.follower_id, followed_id: @relation.followed_id)
        expect(relation2).to be_valid
      end
    end
  end

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

    context "仮想モデルfollowerとのアソシエーション" do
      let(:target) { :follower }

      it "Followerとの関連付けはbelongs_toであること" do
        expect(association.macro).to  eq :belongs_to
      end
    end

    context "仮想モデルfollowedとのアソシエーション" do
      let(:target) { :followed }

      it "Followedとの関連付けはbelongs_toであること" do
        expect(association.macro).to  eq :belongs_to
      end
    end
  end
end


보충 설명



테스트 코드의 내용에 대해



다음과 같이 테스트를 크게 4개로 나누어 실시했습니다.
①보존할 수 있는 경우의 정상계
②보존할 수 없는 경우의 이상계
③ 고유성의 담보
④ 각 모델과의 어소시에이션

①, ②에 대해



follower_id와 followed_id의 유무에 의한 밸리데이션을 실시하고 있습니다.

③에 대해



follower_id와 followed_id의 조합을 검증하고 있습니다.
시점으로서는 팔로우되는 측과 팔로우하는 측 크게 2개 있습니다.

한 사용자가 @user1이라고 가정했습니다.

자신과 다른 ID의 경우 팔로우 할 수 있습니다. 즉, 자신이 팔로우 할 수없는 것을 테스트하고 있습니다.

또, 팔로우하는 측은 같은 사람에게는 1회 밖에 팔로우를 할 수 있는 테스트도 실시하고 있습니다.

④에 대해



각 모델과의 어소시에이션의 밸리데이션을 실시하고 있습니다.

이상입니다.

좋은 웹페이지 즐겨찾기