【Rails6】RSpec에 의한 팔로우 기능의 결합 테스트의 구현

소개



서비스 품질을 유지하기 위해 필수적인 테스트를 실시하고 있습니다.

이번에는 사용자 팔로우 기능의 결합 테스트를 구현하고 그 구현 내용을 기사로 해 나가고 싶습니다.

전제



· Relationship (팔로우) 모델의 단위 테스트는 실시 완료

※완료되어 있지 않은 분이나 단체 테스트와 병행해 보시고 싶은 분은, 이하의 Relationship 모델의 단체 테스트에 관한 기사를 참고해 주세요.

버전



루비 버전 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/support/sign_in_support.rb
module SignInSupport
  def sign_in(user)
    visit user_session_path
    fill_in 'user[email]', with: user.email
    fill_in 'user[password]', with: user.password
    find('input[name="commit"]').click
    expect(current_path).to eq(root_path)
  end
end

테스트 코드 내용



spec/system/relationships_spec.rb
require 'rails_helper'

RSpec.describe "Relationships", type: :system do
before do
    @user1 = FactoryBot.create(:user)
    @user2 = FactoryBot.create(:user)
  end

    describe '#create,#destroy' do
        it 'ユーザーをフォロー、フォロー解除できる' do 
            # @user1としてログイン           
            sign_in(@user1)

            # @user1としてユーザー一覧ページへ遷移する
            visit users_path(@user1)

            # @user2をフォローする
            find('#no-follow').click
            expect(page).to have_selector '#yes-follow'
            expect(@user2.followed.count).to eq(1)
            expect(@user1.follower.count).to eq(1)

            # @user2をフォロー解除する
            find('#yes-follow').click
            expect(page).to have_selector '#no-follow'
            expect(@user2.followed.count).to eq(0)
            expect(@user1.follower.count).to eq(0)
        end
    end
end

보충 설명



'user2 팔로우' 테스트 코드 정보



아래의 전반의 행에서는, user1이 user2 팔로우하면, user2의 팔로워수가 1 오른다는 의미의 문법입니다.

한편, 후반의 행에서는 user1이 user2 팔로우하면, user1의 팔로우수가 1 오른다는 의미의 문법입니다.

spec/system/relationships_spec.rb
 expect(@user2.followed.count).to eq(1)
 expect(@user1.follower.count).to eq(1)

'user2 팔로우 해제' 테스트 코드 정보



「user2를 팔로우한다」의 테스트 코드의 반대의 의미가 있어, 팔로우 해제하면 카운트수가 1 줄어들기 때문에 0이 된다고 하는 의미의 문법입니다.

spec/system/relationships_spec.rb
 expect(@user2.followed.count).to eq(0)
 expect(@user1.follower.count).to eq(0)

이상입니다.

좋은 웹페이지 즐겨찾기