【101日目】【1日20分のRailsチュートリアル】【第9章】ユーザーにログインを要求する処理のテストを作成する
今日は「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 正しいユーザーを要求する」から。