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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

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

Q&A

解決済

1回答

1264閲覧

【RSpec】rack_session_accessを用いてログイン処理を行なった後ビューファイルの表示が変わるのを確かめたい

guguasmon

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/03 03:26

編集2020/09/03 03:33

前提・実現したいこと

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'

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

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

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

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

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

guest

回答1

0

自己解決

セッションIDのセットではなく、ログインボタンを押してモックでTwitterAPIの外部認証を行うようにした結果、自己解決しました。

投稿2020/09/04 07:30

guguasmon

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問