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

###［Remember me］をテストする
####テストされていないブランチで例外を発生する
app/helpers/sessions_helper.rb

```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

```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

```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の２つ目のテストで失敗することを確かめてみましょう（このテストが正しい対象をテストしていることを確認してみましょう）。

```
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]が一致していない体と思う。