前提・実現したいこと
現在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
あなたの回答
tips
プレビュー