Ruby on Rails チュートリアル Rails5.1(第4版)
AWSでやっています。
#質問内容:リスト 10.20のテスト内容を日本語に起こしてみたのですが、正しいでしょうか。理解できているのかを確認したいです。
チュートリアルに、以下のテストがあります。
リスト 10.20: editとupdateアクションの保護に対するテストする red
test/controllers/users_controller_test.rb
require 'test_helper' class UsersControllerTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) end . . . test "should redirect edit when not logged in" do get edit_user_path(@user) assert_not flash.empty? assert_redirected_to login_url end test "should redirect update when not logged in" do patch user_path(@user), params: { user: { name: @user.name, email: @user.email } } assert_not flash.empty? assert_redirected_to login_url end end
また、以下のクラスがあります。
リスト 10.15: beforeフィルターにlogged_in_userを追加する red
app/controllers/users_controller.rb
class UsersController < ApplicationController before_action :logged_in_user, only: [:edit, :update] . . . private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # beforeアクション # ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? flash[:danger] = "Please log in." redirect_to login_url end end end
リスト 10.19: セキュリティモデルを確認するためにbeforeフィルターをコメントアウトするgreen
app/controllers/users_controller.rb
class UsersController < ApplicationController # before_action :logged_in_user, only: [:edit, :update] . . . end
テストの処理内容を日本語に起こします。
##テストひとつめ
test "should redirect edit when not logged in" do get edit_user_path(@user) assert_not flash.empty? assert_redirected_to login_url end
テスト内容は、
users.ymlの内容が代入されている@user変数を用いて、(ログインを行わずに)edit_user_path(相対パス)へアクセス。
ユーザー編集ページへ移動。
flashがempty(空ではないか)か、チェック。assert_notなので、
- flashが空のとき (真である)なら テストはRED
- flashが空でないとき (偽である)なら テストはGREEN
assert_redirected_to login_urlは、login_url(redirectなので絶対パス)へリダイレクトしたかをチェック
- リダイレクトしていたら GREEN
- リダイレクトしていなければ RED
そして、
リスト 10.19: セキュリティモデルを確認するためにbeforeフィルターをコメントアウトするgreen
app/controllers/users_controller.rb
class UsersController < ApplicationController # before_action :logged_in_user, only: [:edit, :update] . . . end
このように、
# before_action :logged_in_user, only: [:edit, :update]
となっていた場合は、
# ログイン済みユーザーかどうか確認 def logged_in_user unless logged_in? flash[:danger] = "Please log in." redirect_to login_url end end
logged_in_userメソッドがeditとupdateアクションの前に動作しなくなるから、
ログインを行わずに、編集ページへアクセスしたのに、
- flash[:danger] = "Please log in."が空である
- login_urlにリダイレクトされなかった
ため、テストはREDになる。
という認識であっているでしょうか。
長文読んでいただきありがとうございました。
テスト二つ目を書こうかと思いましたが、長いのでひとつだけにします。
あなたの回答
tips
プレビュー