【92日目】【1日20分のRailsチュートリアル】【第8章】記憶ブランチをテストする
今日は「8.4.6 Rememberのテスト」の「記憶ブランチをテストする」から。
8.4.6 Rememberのテスト
記憶ブランチをテストする
current_user内のある分岐部分については、これまでまったくテストが行われていないのです。
(中略)わざと例外発生を仕込むという手法を好んで使います。
そのコードブロックがテストから漏れていれば、テストはパスしてしまうはずです。
まずはテストを忘れてる部分に例外発生を仕込む。
app/helpers/sessions_helper.rb
: elsif (user_id = cookies.signed[:user_id]) raise # テストがパスすれば、この部分がテストされていないことがわかる user = User.find_by(id: user_id) :
raise
で例外発生させられるっぽい。
試しにテスト実行してみると通ってしまう。
$ bundle exec rake test 27 tests, 64 assertions, 0 failures, 0 errors, 0 skips
以前作成した以下のSessionsヘルパーのテストでcurrent_userを直接テストすれば、この制約を突破できます。
以前作成したってどのテストだ。。。まぁいいや。
テスト手順はシンプルです。
1. フィクスチャでuser変数を定義する
2. 渡されたユーザーをrememberメソッドで記憶する
3. current_userが、渡されたユーザーと同じであることを確認します。
テストファイルを作成して
$ touch test/helpers/sessions_helper_test.rb
下記のように更新。
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 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
@userインスタンスとcurrent_userが一緒であればログインされていることを確認するテスト、
Userの記憶ダイジェストと記憶トークン異なっていればcurrent_userがnilになることを確認するテストを追加。
5.6で簡単に触れたように、アサーションassert_equalの引数は、期待する値、実際の値の順序で書くのがルールになっています。
assert_equal <期待する値>, <実際の値>
へー。そうなのか。
今度は期待通りにテストNGとなることを確認。
$ bundle exec rake test TEST=test/helpers/sessions_helper_test.rb 2 tests, 0 assertions, 0 failures, 2 errors, 0 skips
ここまでできれば、current_userメソッドに仕込んだraiseを削除して元に戻す (リスト8.57) ことで、リスト8.55のテストがパスするはずです 。
app/helpers/sessions_helper.rb
に追加したraiseを削除して、テストが通ることを確認。
$ bundle exec rake test 29 tests, 67 assertions, 0 failures, 0 errors, 0 skips
分かっていないところもあるけど足早に終わらせました。
一回やるだけで完璧に理解は難しいだろうなぁ。
今日の作業時間は【20分】。
次は「8.5 最後に」から。
やっと8章の終わりが見えてきた!