【Rails6】RSpec에 의한 검색 기능(ransack)의 결합 테스트의 구현

소개



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

이번에는 ransack을 사용하여 구현한 검색 기능의 결합 테스트를 구현하고 그 구현 내용을 기사로 해 나가고 싶습니다.

전제



· ransack이라는 gem을 사용하여 검색 기능이 구현되었습니다.
gem 'ransack'

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

버전



루비 버전 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/controllers/application_controller.rb
class ApplicationController < ActionController::Base
#省略
  before_action :set_search

  def set_search
#省略

    @definition_key = Definition.ransack(params[:q])
    @search_definitions = @definition_key.result(distinct: true).page(params[:page])

#省略
  end

#省略
end

※view에 관한 기술의 게재는 생략하고 있습니다.

모델의 유효성 검사



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/system/definitions_spec.rb
#投稿における結合テストの記述は省略

RSpec.describe '投稿のタイトルの検索', type: :system do
  before do
    @definition = FactoryBot.create(:definition)
    @definition_title = "あいうえお"
    @definition_body = Faker::Lorem.sentence
  end
    context '投稿の検索ができるとき' do
        it 'ログインしたユーザーは自らが投稿した投稿の検索ができる' do
        # definitionを投稿したユーザーでログインする
        sign_in(@definition.user)

        # 新規投稿する
        definition_up(@definition_title, @definition_body)

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

        # 検索欄に検索キーワードを入力する
        fill_in 'q[title_cont]', with: 'あ'
        # 検索ボタンをクリックする
        find('#definition_title_search').click
        # 検索結果があることを確認する
        expect(page).to have_content(@definition.title)
        end
   end

보충 설명



fill_in 'q[title_cont]', with: '아'에 대해



검색 입력란의 name 속성 값을 fill_in의 요소로 사용합니다.

이번은 키워드 입력해 검색할 수 있는 테스트를 실시하고 싶기 때문에, 그 키워드가 되는 「아」(적당)를 with 이하로 지정하고 있습니다.

find('#definition_title_search').click 정보



find 인수는 검색 마크 설명의 id 값을 지정합니다.

app/views/index.html.erb
#省略
    <i class="fas fa-search" id='definition_title_search'></i> 
#省略

id의 값은 스스로 임의로 설정할 수 있습니다.
id를 지정할 때는 문장에 #을 붙입니다.

expect(page).to have_content(@definition.title) 정보



최종적으로 타이틀의 표시를 확인할 수 있으면 좋기 때문에, 기술의 의미로서는
'페이지에 게시물 제목이 있는지 확인'
됩니다.

이상입니다.

좋은 웹페이지 즐겨찾기