読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【92日目】【1日20分のRailsチュートリアル】【第8章】記憶ブランチをテストする

Ruby on Railsチュートリアル(第3版)

今日は「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章の終わりが見えてきた!