Password reset test
這節要撰寫整合測試,要針對 if 述句的三個分支進行測試有效和無效的提交,第三個分支留在練習題。
為密碼重設建立一個整合測試文件:
$ rails generate integration_test password_resets
invoke test_unit
create test/integration/password_resets_test.rb
測試的步驟大致跟帳號啟動測試一樣,只是開頭不一樣,我們要先瀏覽「forgot password」表單頁面,提交無效和有效的 email,提交有效的 email 後會建立一個 reset token 接著發送重設密碼的郵件。然後我們瀏覽郵件裡的重設連結,再一次的提交無效和有效的資料,檢查每個情況的行為。
測試程式碼如下:
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'
# Invalid email
post password_resets_path, password_reset: { email: "" }
assert_not flash.empty?
assert_template 'password_resets/new'
# Valid email
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
# Password reset form
user = assigns(:user)
# Wrong email
get edit_password_reset_path(user.reset_token, email: "")
assert_redirected_to root_url
# Inactive user
user.toggle!(:activated)
get edit_password_reset_path(user.reset_token, email: user.email)
assert_redirected_to root_url
user.toggle!(:activated)
# Right email, wrong token
get edit_password_reset_path('wrong token', email: user.email)
assert_redirected_to root_url
# Right email, right token
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
# Invalid password & confirmation
patch password_reset_path(user.reset_token),
email: user.email,
user: { password: "foobaz",
password_confirmation: "barquux" }
assert_select 'div#error_explanation'
# Empty password
patch password_reset_path(user.reset_token),
email: user.email,
user: { password: "",
password_confirmation: "" }
assert_select 'div#error_explanation'
# Valid password & confirmation
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
大部分的程式碼之前都有出現過,唯一這個:
assert_select "input[name=email][type=hidden][value=?]", user.email
是要確認 input 標籤有正確的名稱、類型(hidden)和 email 位址:
<input id="email" name="email" type="hidden" value="[email protected]" />
執行測試應該會通過(Green):
$ bundle exec rake test