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

ぞえの技術めも

Ruby on Rails勉強中

【101日目】【1日20分のRailsチュートリアル】【第9章】ユーザーにログインを要求する処理のテストを作成する

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

今日は「9.2.1 ユーザーにログインを要求する」のテストを修正するところから。

9.2.1 ユーザーにログインを要求する

原因は、editアクションやupdateアクションでログインを要求するようになったため、ログインしていないユーザーだとこれらのテストが失敗するようになったためです

テストに失敗するようになってしまったのでテストを修正するところから。

このため、editアクションやupdateアクションをテストする前にログインしておく必要があります。

テストユーザーとしてログインする、log_in_asヘルパーを使うとのこと。

test/integration/users_edit_test.rb

  :
  test "unsuccessful edit" do
    log_in_as(@user)
  :
  test "successful edit" do
    log_in_as(@user)
  :

テスト実行してテストが通るようになったことを確認。

$ bundle exec rake test
31 tests, 75 assertions, 0 failures, 0 errors, 0 skips

これでテストスイートがパスするようになりましたが、実はbeforeフィルターの実装はまだ終わっておりません。

え、そうなん。

セキュリティモデルに関する実装を取り外してもテストがGREENになってしまうかどうか、実際にコメントアウトして確かめてみましょう (リスト9.16)。

この前追加したコードをコメントアウトしてみる。

app/controllers/users_controller.rb

class UsersController < ApplicationController
  # before_action :logged_in_user, only: [:edit, :update]
  :

テスト実行。

$ bundle exec rake test
31 tests, 75 assertions, 0 failures, 0 errors, 0 skips

あら、通りますね。

beforeフィルターをコメントアウトして巨大なセキュリティーホールが作られたら、テストスイートでそれを検出できるべきです。

ふむふむ。
テスト追加しましょう。

beforeフィルターは基本的にアクションごとに適用していくので、Usersコントローラのテストもアクションごとに書いていきます。

setupとedit/updateアクションを実行してフラッシュが表示されること、ログインページにリダイレクトすることを確認するテストを追加。

test/controllers/users_controller_test.rb

  :
  def setup
    @user = users(:michael)
  end
  :
  test "should redirect edit when not logged in" do
    get :edit, id: @user
    assert_not flash.empty?
    assert_redirected_to login_url
  end

  test "should redirect update when not logged in" do
    patch :update, id: @user, user: { name: @user.name, email: @user.email }
    assert_not flash.empty?
    assert_redirected_to login_url
  end
end

この時点では、(beforeフィルターが無効のままなので) テストスイートはREDになるはずです。beforeフィルターのコメントアウトを元に戻して、GREENになるかどうか確かめてみましょう (リスト9.18)。

コメントアウトしたままテスト実行してみると失敗する。

$ bundle exec rake test
33 tests, 79 assertions, 2 failures, 0 errors, 0 skips

beforeフィルターのコメントアウトを戻してテスト実行してみると成功した。

$ bundle exec rake test
33 tests, 79 assertions, 0 failures, 0 errors, 0 skips

これらのテストを実装したことによって、うっかり誰でも編集できてしまうバグがあっても、すぐに検知できるようになりました。

検知できる仕組みだいじ。

今日の学習時間は【20分】

次は「9.2.2 正しいユーザーを要求する」から。