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