LoginSignup
0

posted at

サポートモジュールを使用したテストコードのまとめ

アウトプット

サポートモジュールとは、RSpecに用意されている、メソッド等をまとめる機能。

実装の手順

① specディレクトリ配下にsupportディレクトリを作成し、その配下にメソッド名.rbのファイルを作成する

(例)spec/support/sign_in_support.rb
module SignInSupport
  def sign_in(user)
    visit new_user_session_path
    fill_in 'Email', with: user.email
    fill_in 'Password', with: user.password
    find('input[name="commit"]').click
    expect(current_path).to eq(root_path)
  end
end

② サポートモジュールを読み込める設定をする
Rspecを用いてRailsの機能をテストするときに、共通の設定を書いておくファイルspec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require 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の中にモジュール名を記述

RSpec.configure do |config|
  config.include SignInSupport
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

# 以下省略

③結合テストコードの該当部分を、メソッド名に置き換える

spec/system/ファイル名.rb
require 'rails_helper'

RSpec.describe 'データ投稿', type: :system do
  before do
    @user = FactoryBot.create(:user)
    @data_text = Faker::Lorem.sentence
    @data_image = Faker::Lorem.sentence
  end
  context 'データ投稿ができるとき'do
    it 'ログインしたユーザーは新規投稿できる' do
      # ログインする
      sign_in(@user)
  # 以下省略

学んだこと

MVCにおけるbefore_actionメソッドや、
テストコードにおけるbeforeメソッドFactoryBotのように、
結合テストコードにおいても記述量を減らす機能が、Railsに用意されている。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0