【138日目】【1日20分のRailsチュートリアル】【第10章】パスワード再設定のテストを作成する
今日は「10.2.5 パスワードの再設定をテストする」から。
10.2.5 パスワードの再設定をテストする
まずはパスワード再設定のテストファイルを生成しましょう。
生成しました。
$ rails generate integration_test password_resets invoke test_unit create test/integration/password_resets_test.rb
テストの冒頭部分には次のような違いがあります: 最初に「forgot password」フォームを表示して無効なメールアドレスを送信し、次はそのフォームで有効なメールアドレスを送信します。
後者ではパスワード再設定用トークンが作成され、再設定用メールが送信されます。続いて、メールのリンクを開いて無効な情報を送信し、次にそのリンクから有効な情報を送信して、それぞれが期待どおりに動作することを確認します。
長い…!うっかりどれかのテスト書くの忘れそう。。
test/integration/password_resets_test.rb
require 'test_helper' class PasswordResetsTest < ActionDispatch::IntegrationTest def setup ActionMailer::Base.deliveries.clear @user = users(:michael) end test "password resets" do get new_password_reset_path assert_template 'password_resets/new' # メールアドレスが無効 post password_resets_path, password_reset: { email: "" } assert_not flash.empty? assert_template 'password_resets/new' # メールアドレスが有効 post password_resets_path, password_reset: { email: @user.email } assert_not_equal @user.reset_digest, @user.reload.reset_digest assert_equal 1, ActionMailer::Base.deliveries.size assert_not flash.empty? assert_redirected_to root_url # パスワード再設定用フォーム user = assigns(:user) # メールアドレスが無効 get edit_password_reset_path(user.reset_token, email: "") assert_redirected_to root_url # 無効なユーザー user.toggle!(:activated) get edit_password_reset_path(user.reset_token, email: user.email) assert_redirected_to root_url user.toggle!(:activated) # メールアドレスが正しく、トークンが無効 get edit_password_reset_path('wrong token', email: user.email) assert_redirected_to root_url # メールアドレスもトークンも有効 get edit_password_reset_path(user.reset_token, email: user.email) assert_template 'password_resets/edit' assert_select "input[name=email][type=hidden][value=?]", user.email # 無効なパスワードと確認 patch password_reset_path(user.reset_token), email: user.email, user: { password: "foobaz", password_confirmation: "barquux" } assert_select 'div#error_explanation' # パスワードが空 patch password_reset_path(user.reset_token), email: user.email, user: { password: "", password_confirmation: "" } assert_select 'div#error_explanation' # 有効なパスワードと確認 patch password_reset_path(user.reset_token), email: user.email, user: { password: "foobaz", password_confirmation: "foobaz" } assert is_logged_in? assert_not flash.empty? assert_redirected_to user end end
今回の新しい要素はinputタグぐらいでしょう
assert_select "input[name=email][type=hidden][value=?]", user.email
こんな書き方でinputタグのテストができるのかー。
user.toggle!(:activated)
って出てきたことあったっけ、と思ってたらあったわ。
引数に:activatedを渡すことでアカウント有効化の切り替えができるんだね。
テストで問題ないことを確認。
$ bundle exec rake test 45 tests, 210 assertions, 0 failures, 0 errors, 0 skips
今日の学習時間は【23分】。
次は「10.3 本番環境でのメール」から。