#はじめに
Railsでオリジナルアプリ制作を終えました。モデルの単体テストは完了したものの、結合テストは未実施でした。ユーザーがログインしないと使えない機能テストにおいて、ログイン処理を繰り返しテストコードに記述するのは避けたいと思います。より簡素な記述をするため、書き記します。
開発環境
ruby 2.6.5
Rails 6.0.3.4
Gem : gem 'rspec-rails'
#目次
1.ログイン処理
2.簡素なログイン処理の記述
#1.ログイン処理
ログインするにあたり、email及びパスワードが必要だと仮定する。テストコードにおける記述は以下のようになる。問題は機能テストごとにログイン処理を書く必要がある。これを簡略化する方法を次の節で説明する。
visit root_path
fill_in 'user_email', with: user.email
fill_in 'user_password', with: user.password
click_on("Log in")
expect(current_path).to eq root_path
#以下ログインした状態での機能テストの記述を書く
visit new_desk_path
※なお、email入力フォームのidはuser_email、パスワードはuser_passwordとする。
#2.簡素なログイン処理の記述
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
ここで定義したsign_inメソッドをテストコードのファイルで使用できるように下記を設定する。
# コメントアウトを外す
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
# 中略
RSpec.configure do |config|
# 追記
config.include SignInSupport
以上によりsign_inメソッドを使用できるようになった。下記に使用例を示す。
before do
#テスト用のユーザーダミーデータを生成する。
@user = FactoryBot.create(:user)
end
context '画像投稿ができるとき'do
it 'ログインしたユーザーは新規投稿できる' do
# ログインする
sign_in(@user)
#以下省略
以上