###送信メールのテスト
####パスワード再設定用メイラーメソッドのテストを追加する
test/mailers/user_mailer_test.rb
require 'test_helper'
class UserMailerTest < ActionMailer::TestCase
test "account_activation" do
user = users(:michael)
user.activation_token = User.new_token
mail = UserMailer.account_activation(user)
assert_equal "Account activation", mail.subject
assert_equal [user.email], mail.to
assert_equal ["noreply@example.com"], mail.from
assert_match user.name, mail.body.encoded
assert_match user.activation_token, mail.body.encoded
assert_match CGI.escape(user.email), mail.body.encoded
# 上のメソッドを使うとテスト用のユーザーのメールアドレスをエスケープすることもできます
# エスケープ済みメールアドレスをテスト
# assert_matchという非常に強力なメソッドが使われています。
# これを使えば、正規表現で文字列をテスト
# fixtureユーザーに有効化トークンを追加している。
# 追加しない場合は空白になります。
# このテストがパスするには、テストファイル内のドメイン名を
# 正しく設定する必要があります
end
test "password_reset" do
user = users(:michael)
# テストユーザー
user.reset_token = User.new_token
# 新しくトークンを作成
mail = UserMailer.password_reset(user)
# mail わからない。
assert_equal "Password reset", mail.subject
# メールのタイトルがあっているか?
assert_equal [user.email], mail.to
# 宛先はユーザーアドレスはあっているか?
assert_equal ["noreply@example.com"], mail.from
# 送り元はあっているか?
assert_match user.reset_token, mail.body.encoded
# 第一引数の正規表現の値と第二引数の値がマッチすれば
# 成功になるメソッドです。
# メールの本文を(US-ASCIIに)エンコードで、テストの前に
# テストファイル内のドメイン名を正しく設定する
assert_match CGI.escape(user.email), mail.body.encoded
# 与えられた文字列を URL エンコードした文字列を新しく作成し返します。
# それと一致するか?
end
end
###演習
1.
メイラーのテストだけを実行してみてください。このテストは green になっているでしょうか?
ubuntu:~/environment/sample_app (password-reset) $ rails test:mailers
Started with run options --seed 62955
2/2: [==============================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.23588s
2 tests, 16 assertions, 0 failures, 0 errors, 0 skips
リスト 12.12にある2つ目のCGI.escapeを削除すると、テストが red になることを確認してみましょう。
assert_match mail.body.encoded
これでいいのかな?
とりあえずエラーになった。