yuta_eng_prg’s diary

筆者がプログラミング学習の内容を綴るだけのブログです。

テストコード(サポートモジュールの活用)

テストコードにおけるサポートモジュールの活用方法について確認します。

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

まず、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

上記のようにまとめたい機能を記述します。 そして、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'
中略
# 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 }

# Checks for pending migrations and applies them before tests are run.
# If you are not using ActiveRecord, you can remove these lines.
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|
下記のコード一行を追加します。今回は「SignInSupport」と記述していますが、作成したモジュール名を記述します。
  config.include SignInSupport
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  中略
end

上記のように編集します。 最後に作成したモジュールを各ファイルに実装します。

一例として、

require 'rails_helper'

RSpec.describe 'ツイート投稿', type: :system do
  before do
    @user = FactoryBot.create(:user)
    @tweet_text = Faker::Lorem.sentence
    @tweet_image = Faker::Lorem.sentence
  end
  context 'ツイート投稿ができるとき'do
    it 'ログインしたユーザーは新規投稿できる' do
      # ログインする
下記の「sign_in(@user)」の部分にモジュールを実装しています。
      sign_in(@user)
      # 新規投稿ページへのリンクがある
      expect(page).to have_content('投稿する')
      # 投稿ページに移動する
      visit new_tweet_path
      # フォームに情報を入力する
      fill_in 'tweet_image', with: @tweet_image
      fill_in 'tweet_text', with: @tweet_text
      # 送信するとTweetモデルのカウントが1上がる
      expect{
 中略
end

上記のような記述を行います。

以上が、サポートモジュールの活用方法です。