0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails結合テスト ログイン処理まとめ

Posted at

#はじめに
Railsでオリジナルアプリ制作を終えました。モデルの単体テストは完了したものの、結合テストは未実施でした。ユーザーがログインしないと使えない機能テストにおいて、ログイン処理を繰り返しテストコードに記述するのは避けたいと思います。より簡素な記述をするため、書き記します。

開発環境
ruby 2.6.5
Rails 6.0.3.4
Gem : gem 'rspec-rails'

#目次
1.ログイン処理
2.簡素なログイン処理の記述

#1.ログイン処理
ログインするにあたり、email及びパスワードが必要だと仮定する。テストコードにおける記述は以下のようになる。問題は機能テストごとにログイン処理を書く必要がある。これを簡略化する方法を次の節で説明する。

spec/system/○○_spec.rb
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ファイルを作成し、下記ログイン処理のメソッドを作成する。

spec/supports/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メソッドをテストコードのファイルで使用できるように下記を設定する。

spec/rails_helper.rb
# コメントアウトを外す
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

# 中略

RSpec.configure do |config|
  # 追記
  config.include SignInSupport

以上によりsign_inメソッドを使用できるようになった。下記に使用例を示す。

spec/system/○○_spec.rb
before do
    #テスト用のユーザーダミーデータを生成する。
    @user = FactoryBot.create(:user)
  end
  context '画像投稿ができるとき'do
    it 'ログインしたユーザーは新規投稿できる' do
      # ログインする
      sign_in(@user)
#以下省略

以上

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?