質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

935閲覧

ユーザーのログインに関する統合テストが通らない

asayuki

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/09/23 18:01

前提・実現したいこと

現在Railsで簡単なWebアプリを作っています。
途中からdeviseを導入してテストをすべて書き直していたところ、ログインに関する統合テストusers_login_testでエラーが発生してしまいました。

発生している問題・エラーメッセージ

Expected false to be truthy.

該当のソースコード

app/test/integration/users_login_test.rb

require "test_helper" class UsersLoginTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end test "login with valid email/invalid password" do get login_path assert_template 'users/sessions/new' post login_path, params: { session: { email: @user.email, encrypted_password: "" } } assert_not is_logged_in? assert_template 'users/sessions/new' assert_not flash.empty? get root_path assert flash.empty? end test "login with valid information followed by logout" do get login_path post login_path, params: { session: { email: @user.email, encrypted_password: 'password' } } assert is_logged_in? #ここで問題のエラーが出ました。 assert_redirected_to root_url follow_redirect! assert_select "a[href=?]", login_path, count: 0 assert_select "a[href=?]", logout_path assert_select "a[href=?]", user_path(@user) delete logout_path assert_not is_logged_in? assert_redirected_to root_url follow_redirect! assert_select "a[href=?]", login_path assert_select "a[href=?]", logout_path, count: 0 assert_select "a[href=?]", user_path(@user), count: 0 end end

app/test/test_helper.rb

ENV['RAILS_ENV'] ||= 'test' require_relative "../config/environment" require "rails/test_help" require "minitest/reporters" Minitest::Reporters.use! class ActiveSupport::TestCase # Run tests in parallel with specified workers parallelize(workers: :number_of_processors) # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Add more helper methods to be used by all tests here... def is_logged_in? !session[:user_id].nil? end def log_in_as(user) session[:user_id] = user.id end end class ActionDispatch::IntegrationTest def log_in_as(user, password: 'password') post login_path, params: { session: { email: user.email, password: password } } end end

app/controllers/users/sessions_controller.rb

class Users::SessionsController < Devise::SessionsController before_action :configure_sign_in_params, only: [:create] before_action :authenticate_user!, only: [:destroy] # GET /resource/sign_in def new super end # POST /resource/sign_in def create super end # DELETE /resource/sign_out def destroy super end # protected # If you have extra params to permit, append them to the sanitizer. def configure_sign_in_params devise_parameter_sanitizer.permit(:sign_in, keys: [:name]) end end

試したこと

最初はtest_helperのis_logged_in?メソッドを記述せずにテストを書いていたら

Expected response to be a <3XX: redirect>, but was a <200: OK>

というエラーがassert_redirected_to root_urlの部分で
出ました。ググると、恐らくリダイレクト先の記述が間違っていると書いてありましたが、deviseのデフォルトからリダイレクト先を変更していませんので、ここではなくpostのテストの部分で正しくログイン処理が行われていないのではないかと考えられます。
初学者ですので非常にわかりずらい記述になってしまっているかもしれませんが、少しでも助力していただけると幸いです。

補足情報(FW/ツールのバージョンなど)

Rails 6.1.4
Ruby 2.6.3
Devise 4.8.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問