前提・実現したいこと
railsでWevアプリを開発していて、Twitter認証機能を実装しました。
gemはomniauth、omniauth-twitter、dotenv-rails'などを利用していてdeviseは利用していません。
そのため、session[:uid]にユーザーidを代入する形でログイン処理を実装しました。
こちらの記事を参考にしました。
手動ではログイン前とログイン後でビューファイルの表示が変わるのを確認しています。
今はRSpecでも同様にログイン処理を行なった後でビューファイルの表示が変わるのを確かめたいと思っています。
RSpecでログイン状態のユーザーを作る時にもsession[:uid] = user.uidと書きたいところですが、
RSpecのfeature spec及びsystem specではデフォルトでsessionメソッドが使えません。
そこでrack_session_accessをインストールして使えるようにしました。
発生している問題・エラーメッセージ
page.set_rack_session(uid: @user.uid) テストの際上記でログイン処理を行ったが、その後ビューファイルの表示が変わらずエラーが出てしまう。
結合テストの様子
ターミナルの表示
ログイン後はこのような表示になる予定
該当のソースコード
spec/system/users_spec.rb
ruby
1require 'rails_helper' 2 3RSpec.describe "Users", type: :system do 4 # before { request.env["omniauth.auth"] = twitter_mock } 5 # subject { get :create, params: { provider: "twitter" } } 6 before do 7 @user = FactoryBot.build(:user) 8 end 9 10 context 'Twitter認証ができるとき' do 11 it 'ユーザーが許可を出した時、Twitter認証ができてトップページに移動する' do 12 visit root_path 13 expect(page).to_not have_content('マイページ') # ログイン前はマイページという表示が無い 14 page.set_rack_session(uid: @user.uid) # ログイン 15 visit root_path 16 expect(page).to have_content('マイページ') # マイページと表示されている 17 end 18 end 19~省略~ 20 21end
spec/factories/users.rb
ruby
1FactoryBot.define do 2 factory :user do 3 uid { 123456 } 4 nickname {Faker::Name.first_name} 5 name {Faker::Name.initials(number: 2)} 6 image {Faker::Lorem.sentence} 7 end 8end
app/view/shared/_header.html.erb
html
1<header class="header"> 2 <div class="logo"> 3 <%= link_to '卓の輪', root_path, class: "logo" %> 4 </div> 5 <div class="nav"> 6 <ul class="lists"> 7 <% if logged_in? %> 8 <li class="list"><%= link_to '日程記入', "#", class: "schedule" %></li> 9 <li class="list"><%= link_to 'マッチング', "#", class: "matching" %></li> 10 <li class="list"><%= link_to 'ログアウト', logout_path %></li> 11 <li class="list"><%= link_to 'マイページ', "#", class: "my-page" %></li> 12 <% else %> 13 <li class="list"><%= link_to 'ログイン', "/auth/twitter" %></li> 14 <% end %> 15 </ul> 16 </div> 17</header>
app/helpers/sessions_helpers.rb
ruby
1module SessionsHelper 2 # 渡されたユーザーでログインする 3 def log_in(user) 4 session[:uid] = user.uid 5 end 6 7 # 現在ログイン中のユーザーを返す (いる場合) 8 def current_user 9 if session[:uid] 10 @current_user ||= User.find_by(uid: session[:uid]) 11 end 12 end 13 14 # ユーザーがログインしていればtrue、その他ならfalseを返す 15 def logged_in? 16 !current_user.nil? 17 end 18 19 # 現在のユーザーをログアウトする 20 def log_out 21 session.delete(:uid) 22 @current_user = nil 23 end 24end
試したこと
session[:uid]が代入されていないのではと思い
page.get_rack_sessionでsessionの中身を確認したところ、uidは代入できていた。
page.get_rack_sessionで確認した
logged_in?のヘルパーメソッドが機能していないのではと思うのですが、どのようにアプローチしたら良いかわからず途方に暮れています。
補足情報(FW/ツールのバージョンなど)
動作環境
ruby 2.6.5
Rails 6.0.0
RSpec 4.0.0
gem 'omniauth'
gem 'omniauth-twitter'
gem 'dotenv-rails'
gem 'rack_session_access'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。