状況、実現したいこと
omniauth-twitter
というgemを使ったTwitterログイン機能を備えたサービスがあります。
ログイン方法はTwitterログインだけです。
ログインのテストの書き方が分からず、アドバイスをいただきたいです。
ログイン処理の流れ
- ログインボタンをクリックすると
/auth/twitter
にリクエストが飛ぶ - Twitter画面で連携を許可すると、
sessions#create
が発火する(request.env['omniauth.auth']
にユーザーの情報が渡される) - すでに登録されているユーザーならログイン、未登録のユーザーなら新規登録
※ログイン機能を実装した時に、大まかな流れを以下の記事にまとめました。
Railsアプリに簡単なTwitterログインを実装する
View
1<a href="/auth/twitter">ログイン</a>
Controller
1# 超Fatなのはテストを書いた後に直します 2def create 3 unless request.env['omniauth.auth'][:uid] 4 flash[:danger] = '連携に失敗しました' 5 redirect_to(root_url) && return 6 end 7 user_data = request.env['omniauth.auth'] 8 user = User.find_by(uid: user_data[:uid]) 9 if user 10 log_in user 11 flash[:success] = 'ログインしました' 12 else 13 new_user = User.new( 14 uid: user_data[:uid], 15 nickname: user_data[:info][:nickname], 16 name: user_data[:info][:name], 17 image: user_data[:info][:image], 18 desc: user_data[:info][:description] 19 ) 20 if new_user.save 21 log_in new_user 22 flash[:success] = 'ユーザー登録成功' 23 else 24 flash[:danger] = '予期せぬエラーが発生しました' 25 redirect_to(root_url) && return 26 end 27 end 28 redirect_to mypage_url(current_user) 29end
table
1# usersテーブルの情報 2Table name: users 3 id :bigint not null, primary key 4 desc :string 5 fav_battle :string 6 fav_p_line :string 7 image :string 8 name :string 9 nickname :string 10 uid :string 11 created_at :datetime not null 12 updated_at :datetime not null 13 mc_id :bigint
routes
1Rails.application.routes.draw do 2 resources :mypages, only: %i[show edit update] 3 get '/auth/:provider/callback', to: 'sessions#create' 4 get '/logout', to: 'sessions#destroy' 5end
やってみたこと、調べてわかったこと
- モックを使って、テストの中でダミーのユーザー情報を取得する方法があることを知る
- 使えるRSpec入門・その3「ゼロからわかるモック(mock)を使ったテストの書き方」を読んでモックの概念、基本的な使い方をなんとなく理解する
- Mockを使って、Facebookログイン部分のRSpecを書いてみた!!を読み、似たようなやり方で実装できるのではないかと感じた
問題点、分からないこと
- 上記のFacebookログインの記事では
OmniAuth.config
という記述が多用されていまずが、omniauthのgemは使っていないのでそのまま使うことはできません。OmniAuth.config
という、gem側で用意されているメソッド?を使わないとうまくテストが書けないのか、使わないでもなんとかなるのかの判断ができていない状態です。(私の使っているgemomniauth-twitter
では、OmniAuth.config
に相当するものは用意されていない様子) - モックを作れた場合、capybaraを使った統合テストで活用できるものなのかが分かっていません。「トップページにアクセス→ログインボタンをクリック→ユーザー名が表示される」というテストを書けると一番良いのですが、難しいなら他の方法で実装するしかないと思っています。
- ログイン後の振る舞いをテストする際、「ログイン済みのユーザーを作成する」ヘルパーメソッド等が必要になるが、実装方法が浮かんでいません。
まとまりの無い文章ですみません。要は
今の実装のままでログインの統合テストが書けるのか
どうかが知りたいです。よろしくお願いいたします。
あなたの回答
tips
プレビュー