Rails6] RSpec에 의한 페이지 네이션 기능 (kaminari)의 결합 테스트 구현

소개



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

이번에는, 카미나리를 사용해, 구현한 페이지네이션 기능의 결합 테스트를 구현해, 그 구현 내용을 기사로 해 가고 싶습니다.

전제



· kaminari라는 gem을 사용한 페이지 네이션 기능이 구현되었습니다.
gem 'kaminari'
gem 'kaminari-bootstrap'

· 투고시의 결합 테스트와 같은 테스트 파일에 페이지 네이션 기능의 내용도 기술하고 있습니다.
투고시에 있어서의 테스트 코드의 기술은 이하의 URL보다 보실 수 있습니다.

버전



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

실시한 테스트







페이지 네이션 화면





모델에서 페이지 네이션 설정



모델에서, 투고의 표시는 1페이지 3건까지로 하고 있습니다.

app/models/definition.rb
# 〜省略〜

# 最近作成されたユーザーから表示
default_scope -> { order(created_at: :desc) }
# 一度に表示する投稿数
paginates_per 3

# 〜省略〜

정의 테이블의 열 소개



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/support/definition_up_support.rb
module DefinitionUpSupport
  def definition_up(definition_title, definition_body)

    # 新規投稿ページへのリンクがあることを確認する
    expect(page).to have_content('投稿')

    # 投稿作成ページに移動する
    visit new_definition_path

    # フォームに情報を入力する
    fill_in 'definition[title]', with: definition_title
    fill_in 'definition[body]', with: definition_body

    # 送信するとDefinitionモデルのカウントが1上がることを確認する
    expect{
      find('input[name="commit"]').click
    }.to change { Definition.count }.by(1)

    # 投稿完了ページに遷移することを確認する
    expect(current_path).to eq(root_path)
  end
end

페이지 전환과 게시물의 존재를 확인하는 설명을 모듈화하고 있습니다.

spec/support/page_up_support.rb
module PageUpSupport
  def page_up(definition)
    # ページ遷移していることを確認する
    expect(current_path).to eq(root_path)

    # 投稿があることを確認する
    expect(page).to have_no_content("#{definition.title}")
  end
end

테스트 코드 내용



spec/system/definitions_spec.rb

#投稿における結合テストの記述は省略

RSpec.describe 'ページネーションについて', type: :system do
    before do
      @definition = FactoryBot.create(:definition)
      @definition_title = Faker::Lorem.sentence
      @definition_body = Faker::Lorem.sentence
    end
      context 'ページネーションでページ遷移ができるとき' do
          it 'ログインしたユーザーはページネーションでページ遷移ができる' do
          # definitionを投稿したユーザーでログインする
          sign_in(@definition.user)

          # ①新規投稿する(投稿は3件表示のため4つ投稿を行う)
          definition_up(@definition_title, @definition_body)

          # ②新規投稿する(投稿は3件表示のため4つ投稿を行う)
          definition_up(@definition_title, @definition_body)

          # ③新規投稿する(投稿は3件表示のため4つ投稿を行う)
          definition_up(@definition_title, @definition_body)

          # ④新規投稿する(投稿は3件表示のため4つ投稿を行う)
          definition_up(@definition_title, @definition_body)

          # 投稿ページに移動する
          visit root_path(anchor:"ethics")

          # ページがあることを確認
          expect(page).to have_css(".page-link")

          # ページネーション'2'のボタンをクリックし、次ページへと行く
          expect{ find_link('2', rel="next").click }

          # ページ遷移していることを確認し、投稿があることを確認する
          page_up(@definition)

          # ページネーション'1'のボタンをクリックし前ページへと行く
          expect{ find_link('1', rel="prev").click }

          # ページ遷移していることを確認し、投稿があることを確認する
          page_up(@definition)

          # ページネーションボタン'最後'のボタンをクリックし、最後のページへと行く
          expect{ find_link('最後', ".page-link").click }

          # ページ遷移していることを確認し、投稿があることを確認する
          page_up(@definition)

          # ページネーションボタン'最初'のボタンをクリックし、最初のページへと行く
          expect{ find_link('最初', ".page-link").click }

          # ページ遷移していることを確認し、投稿があることを確認する
          page_up(@definition)
       end
    end
end


이상입니다.

좋은 웹페이지 즐겨찾기