0
0

More than 1 year has passed since last update.

railsチュートリアル第9章 [Remember me]をテストする

Posted at

[Remember me]をテストする

テストされていないブランチで例外を発生する

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # そうでなければ 書名付きクッキーを代入
      raise      
      # テストがパスすれば、この部分がテストされていないことがわかる
      # プログラムを強制的に終了させて、ログをみることができます。
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
     # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
.
.
.
end
テスト
ubuntu:~/environment/sample_app (advanced-login) $ rails t
Running via Spring preloader in process 3594
Started with run options --seed 7832

  27/27: [============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.99923s
27 tests, 65 assertions, 0 failures, 0 errors, 0 skips

永続的セッションのテスト

test/helpers/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_equalの引数は「期待する値, 実際の値」の順序で書く点に注意
    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))
    # remember_digestに新たなダイジェストに更新させる。
    assert_nil current_user
    # current_userが空であるか?
  end
end
テスト
ubuntu:~/environment/sample_app (advanced-login) $ rails test test/helpers/sessions_helper_test.rb
Running via Spring preloader in process 5361
Started with run options --seed 40990

ERROR["test_current_user_returns_right_user_when_session_is_nil", #<Minitest::Reporters::Suite:0x00007f694d3790c0 @name="SessionsHelperTest">, 0.04437192499972298]
 test_current_user_returns_right_user_when_session_is_nil#SessionsHelperTest (0.05s)
RuntimeError:         RuntimeError: 
            app/helpers/sessions_helper.rb:29:in `current_user'
            test/helpers/sessions_helper_test.rb:11:in `block in <class:SessionsHelperTest>'

ERROR["test_current_user_returns_nil_when_remember_digest_is_wrong", #<Minitest::Reporters::Suite:0x00007f694d3af670 @name="SessionsHelperTest">, 0.05875992499977656]
 test_current_user_returns_nil_when_remember_digest_is_wrong#SessionsHelperTest (0.06s)
RuntimeError:         RuntimeError: 
            app/helpers/sessions_helper.rb:29:in `current_user'
            test/helpers/sessions_helper_test.rb:17:in `block in <class:SessionsHelperTest>'

  2/2: [==============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.06407s
2 tests, 0 assertions, 0 failures, 2 errors, 0 skips

RuntimeError
コンピュータプログラムを実行したときに発生するエラー

例外発生部分を削除する

app/helpers/sessions_helper.rb

module SessionsHelper
.
.
.
   # 記憶トークンcookieに対応するユーザーを返す
  def current_user
    if (user_id = session[:user_id])
    # ログイン中のidを代入する
    # 永続セッション(ログイン中)にするため
      @current_user ||= User.find_by(id: user_id)
      # カレントユーザーまたは検索結果があったものを代入する
    elsif (user_id = cookies.signed[:user_id])
    # 
      user = User.find_by(id: user_id)
      # idでユーザーを探す
      if user && user.authenticated?(cookies[:remember_token])
     # ユーザーが有効であり、記憶トークンも認証されたら
        log_in user
        # ログインする
        @current_user = user
        # カレントユーザーに代入するかな
      end
    end
  end
.
.
.
end
テスト
ubuntu:~/environment/sample_app (advanced-login) $ rails t
Running via Spring preloader in process 5985
Started with run options --seed 63365

  29/29: [============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.92068s
29 tests, 68 assertions, 0 failures, 0 errors, 0 skips

演習

1.
リスト 9.33にあるauthenticated?の式を削除すると、リスト 9.31の2つ目のテストで失敗することを確かめてみましょう(このテストが正しい対象をテストしていることを確認してみましょう)。

ubuntu:~/environment/sample_app (advanced-login) $ rails t
Running via Spring preloader in process 6130
Started with run options --seed 40847

 FAIL["test_current_user_returns_nil_when_remember_digest_is_wrong", #<Minitest::Reporters::Suite:0x0000564263999728 @name="SessionsHelperTest">, 1.8954172630001267]
 test_current_user_returns_nil_when_remember_digest_is_wrong#SessionsHelperTest (1.90s)
        Expected #<User id: 762146111, name: "Michael Example", email: "michael@example.com", created_at: "2021-10-13 05:26:26", updated_at: "2021-10-13 05:26:28", password_digest: [FILTERED], remember_digest: "$2a$04$iNzhau9MGyA3qTcw4SXrWei9IiVGeiQjIJxdNHamfCr..."> to be nil.
        test/helpers/sessions_helper_test.rb:24:in `block in <class:SessionsHelperTest>'

  29/29: [============================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.92342s
29 tests, 68 assertions, 1 failures, 0 errors, 0 skips

わからないけど
cookies[:remember_token]が一致していない体と思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0