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

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

ただいまの
回答率

87.59%

Rails チュートリアル9章 remember meのテストでのFailureについて

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 606

score 15

現在Railsチュートリアルを進行中なのですが、9章のリスト9.26のテストまではGreenだったのですが、9.3.2の最後のテスト(リスト9.33: 例外発生部分を削除するの後)でエラーが出てしまい、エラーメッセージから色々とエラー箇所を探したり、コードをチェックしたのですが、一体どこがテストの失敗に繋がっているのかがわかりませんでした。
テストをパスするにはどうすれば良いのでしょうか?
よろしくお願いします。

エラー

FAIL["test_current_user_returns_right_user_when_session_is_nil", SessionsHelperTest, 0.05229032799979905]
test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (0.05s)
       --- expected
       +++ actual
       @@ -1 +1 @@
       -#<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2019-12-08 13:27:53", updated_at: "2019-12-08 13:27:53", password_digest: "$2a$04$Zgz3mSZggCDcVmcv1knaTOWIMgR6ybBxBwxuiQltjmx...", remember_digest: "$2a$04$V6wJIEa7NzFtK95YjVlftOkIw42Zgs7euB8NpyitZG/...">
       +nil
       test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>'


エラー内容からするに、sessions_helper_test.rbの10行目、assert_equal @user, current_userという部分が問題になっているみたいです。  
ユーザーが存在することを想定されているのに、実際はnilになっているようなのですが、ここから先がなぜnilになってしまっているかがわかりません。
sessions_helper.rb

module SessionsHelper
 # 渡されたユーザーでログインする
 def log_in(user)
   session[:user_id] = user.id
 end

 # ユーザーのセッションを永続的にする
 def remember(user)
   user.remember
   cookies.permanent.signed[:user_id] = user.id
   cookies.permanent[:remember_token] = user.remember_token
 end

 # 現在ログイン中のユーザーを返す(いる場合)
 # 記憶トークンcookieに対応するユーザーを返す
 def current_user
   if (user_id = session[:user_id])
     @current_user ||= User.find_by(id: user_id)
   elsif (user_id = cookies.signed[:user_id])
     user = User.find_by(id: user_id)
     if user && user.authenticated?(cookies[:remember_token])
       log_in user
       @current_user = user
     end
   end
 end

 # ユーザーがログインしていればtrue, その他ならfalseを返す
 def logged_in?
   !current_user.nil?
 end

 # 永続的セッションを破棄する
 def forget(user)
   user.forget
   cookies.delete(:user_id)
   cookies.delete(:remember_token)
 end

 # 現在のユーザーをログアウトする
 def log_out
   forget(current_user)
   session.delete(:user_id)
   @current_user = nil
 end
end


sessions_helper_test.rb

require 'test_helper'
class SessionsHelperTest < ActionView::TestCase
 def setup
   @user = users(:michael)
   remember(@user)
 end
 test "current_user returns right user when session is nil" do
   assert_equal @user, current_user
   assert is_logged_in?
 end
 test "current_user returns nil when remember digest is wrong" do
   @user.update_attribute(:remember_digest, User.digest(User.new_token))
   assert_nil current_user
 end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • KazuSaka

    2019/12/10 23:50

    解決されましたでしょうか?
    まだ悩まれているようでしたら、app/models/user.rbファイルを見たいです。

    解決できるかわかりませんが・・・
    おそらく、current_userメソッド内の以下のIF文がFALSEになっていると、思います。
    if user && user.authenticated?(cookies[:remember_token])

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る