アウトプット
サポートモジュールとは、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に用意されている。