##実現したいこと
sessionの情報の扱っている動作の実現してログアウトを再現したいです。
処理の流れとしては、
ログイン状態でログアウトを実行した場合、
セッション情報を削除してログイン画面に戻ります。
お手数をかけて申し訳ございませんが、
わかる方がおられたらどうか、
対処法のヒントでもいいのでお教えをお願い致します。
##前提
ログイン用のテストは全て通過しております(GREEN)。
ログアウトのテスト部分の行からテストを行っております。
##発生している問題・エラーメッセージ
#####エラーメッセージ
Run options: include {:locations=>{"./spec/controllers/sessions_controller_spec.rb"=>[48]}} FF Failures: 1) SessionsController sessions#destroy ログアウトした場合 セッション情報が削除されること Failure/Error: expect(@user).to eq nil expected: nil got: #<User id: 1, name: "testuser", password_digest: "$2a$04$vDsfCC2abKzIWoBqXqOYbO/WMDqZI1iCUVq50ss.RCy...", created_at: nil, updated_at: nil, birthday: nil> (compared using ==) # ./spec/controllers/sessions_controller_spec.rb:56:in `block (4 levels) in <top (required)>' 2) SessionsController sessions#destroy ログアウトした場合 ログインページに戻ること Failure/Error: expect(response).to redirect_to(root_path) Expected response to be a <3XX: redirect>, but was a <200: OK> Response body: # ./spec/controllers/sessions_controller_spec.rb:60:in `block (4 levels) in <top (required)>' Finished in 0.26175 seconds (files took 9.14 seconds to load) 2 examples, 2 failures Failed examples: rspec ./spec/controllers/sessions_controller_spec.rb:54 # SessionsController sessions#destroy ログアウトした場合 セッション情報が削除されること rspec ./spec/controllers/sessions_controller_spec.rb:59 # SessionsController sessions#destroy ログアウトした場合 ログインページに戻ること
##該当のソースコード
#####sessions_controller_spec.rb[テストコード]
RSpec.describe SessionsController, type: :controller do describe 'sessions#create' do context 'ログインが成功した場合' do before do @user = FactoryBot.build(:user) post(:create, params: { session: { id: @user.id, name: @user.name, password: @user.password } }) end it 'ユーザー名が同じであること' do expect(@user.name).to eq 'testuser' end it 'passwordが同じであること' do expect(@user.password).to eq 'password' end it 'マイページにリダイレクトされること' do expect(response).to redirect_to(mypage_path) end end context 'ログインを失敗した場合' do before do @user = FactoryBot.build(:user) post(:create, params: { session: { id: @user.id, name: 'error', password: @user.password } }) end it 'ログインページにリダイレクトされること' do expect(response).to render_template 'home/index' end end end describe 'sessions#destroy' do context 'ログアウトした場合' do before do @user = FactoryBot.build(:user) end it 'セッション情報が削除されること' do delete :destroy expect(@user).to eq nil end it 'ログインページに戻ること' do expect(response).to redirect_to(root_path) end end end end
#####users.rb[セッション情報のモック]
FactoryBot.define do factory :user do id { 1 } name { "testuser" } password{ "password" } end end
#####sessions_controller.rb[テスト対象]
class SessionsController < ApplicationController def create user = User.find_by(name: params[:session][:name]) if user && user.authenticate(params[:session][:password]) session[:user_id] = user.id redirect_to mypage_path else render 'home/index' end end def destroy session.delete(:user_id) redirect_to root_path end end
##試したこと
下記のコードで実施しましたが、セッションしたユーザーのデータが残っておりました。
その1 delete(:destroy, params: { session: { id: @user.id, name: 'error', password: @user.password } })
・検索でRSpec DELETEで検索した内容を実施するも失敗
https://stackoverflow.com/questions/25496103/delete-an-object-in-rspec-rails
##補足情報(FW/ツールのバージョンなど)
[作業環境]
macOS BigSur 11.2
Docker 20.10
Ruby 2.4.5
Rails 5.2.2
RSpec 3.9.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/02/12 07:30 編集
2021/02/12 08:38