지원 모듈을 사용하여 결합 테스트의 가독성을 향상시키는 방법

개요



지원 모듈을 도입하는 방법에 대한 기사입니다.

도입 절차의 전체 이미지



①지원 모듈용 디렉토리와 파일을 수동으로 작성
② 서포트 모듈의 내용을 기술
③ 서포트 모듈을 읽을 수 있도록 한다
④ 결합 테스트 코드 편집

①지원 모듈용 디렉토리와 파일을 수동으로 작성



spec 디렉토리 아래에 support 디렉토리를 만들고 그 아래에 ~_support.rb를 만듭니다. (~의 부분은 임의)



② 서포트 모듈의 내용을 기술



(예) 투고에 있어서의 기술을 모듈화하고 있습니다.

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

③ 서포트 모듈을 읽을 수 있도록 한다

ir[Rails.root.join('spec', 'support', '*', '.rb')].sort.each { |f| .

spec/rails_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded until this point!

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
#
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }


그런 다음 같은 파일의 RSpec.configure에 다음과 같이 모듈 이름을 지정합니다.

spec/rails_helper.rb
RSpec.configure do |config|
  config.include SignInSupport
  config.include DefinitionUpSupport
  config.include ReviewUpSupport
  config.include PageUpSupport
# 順次追記していきます

④ 결합 테스트 코드 편집

다음과 같이 설명을 바꾸고 중복된 코드를 함께 쓰면 가독성이 향상됩니다.

spec/system/definitions_spec.rb
require 'rails_helper'

RSpec.describe "Definitions", type: :system do
  before do
    @user = FactoryBot.create(:user)
    @definition_title = Faker::Lorem.sentence
    @definition_body = Faker::Lorem.sentence
  end
  context '投稿ができるとき'do
    it 'ログインしたユーザーは新規投稿できる' do
    # ログインする
    sign_in(@user)

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

    # トップページに遷移する
    visit root_path

    # トップページには先ほど投稿した内容の投稿が存在することを確認する
    expect(page).to have_content(@definition_title)
    end
  end
  context '投稿ができないとき'do
    it 'ログインしていないと新規投稿ページに遷移できない' do
       # トップページに遷移する
       visit root_path

       # 新規投稿ページへのリンクがない
       expect(page).to have_no_content('投稿')
    end
  end
end


지원 모듈이란?



메소드 등을 정리하는 기능(RSpec에 탑재)

메소드로서 처리를 정리할 수 있어, 복수회 사용하는 메소드를 정의하고 있습니다.

spec/rails_helper.rb에서 주석 처리하는 의미



올바른 RSpec 내에서는 공통화된 부분을 불러일으키는 제한이 있다. 제한을 제거해야 합니다.

여기에서는 라우팅을 확장하는 설정을 하고 있다. spec 디렉토리 안의, support 디렉토리 안의, **(모든 파일)안의, .rb만 붙은 전부의 파일이 대상이 되고 있습니다.

왼쪽에서 오른쪽으로 갈수록 파일이 깊어지는 이미지입니다.

spec/rails_helper.rb 정보



config 파일에서 SignSupport를 설정에 포함시켜 파일을 확장하고 있다는 설정을 하고 있습니다. 파일에 관해서 확장한 내용을 기술하고 있다고 하는 것입니다.

동일한 처리를 반복할 때 1개로 정리할 때 지원 모듈을 사용합니다.
Rails의 이념으로 반복해서 같은 설명을 해서는 안되는 규칙이 있기 때문입니다.

이상입니다.

좋은 웹페이지 즐겨찾기