###送信メールのプレビュー
テンプレートの実際の表示を簡単に確認するために、メールプレビューという裏技を使う。
Railsでは、特殊なURLにアクセスするとメールのメッセージをその場でプレビューすることができます。
これを利用するには、アプリケーションのdevelopment環境の設定に手を加える必要がある。
####development環境のメール設定
config/environments/development.rb
Rails.application.configure do
.
.
.
config.action_mailer.raise_delivery_errors = false
host = 'example.com' # ここをコピペすると失敗します。自分の環境のホストに変えてください。
# クラウドIDEの場合は以下をお使いください
config.action_mailer.default_url_options = { host: host, protocol: 'https' }
# localhostで開発している場合は以下をお使いください
# config.action_mailer.default_url_options = { host: host, protocol: 'http' }
.
.
.
end
###Userメイラープレビュー
test/mailers/previews/user_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/user_mailer
class UserMailerPreview < ActionMailer::Preview
# Preview this email at http://localhost:3000/rails/mailers/user_mailer/account_activation
def account_activation
user = User.first
user.activation_token = User.new_token
# activation_tokenは仮の属性でしかない
UserMailer.account_activation(user)
end
# Preview this email at http://localhost:3000/rails/mailers/user_mailer/password_reset
def password_reset
UserMailer.password_reset
end
end
実装すると、指定のURLでアカウント有効化メールをプレビューできるようになります
###演習
1.
Railsのプレビュー機能を使って、ブラウザから先ほどのメールを表示してみてください。「Date」の欄にはどんな内容が表示されているでしょうか?
urlにrails/mailers/user_mailer/account_activationを貼り付けた。
時日が表示されていた。
###送信メールのテスト
####Userメイラーのテスト(Railsによる自動生成)
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.
# エスケープ済みメールアドレスをテスト
# assert_matchという非常に強力なメソッドが使われています。
# これを使えば、正規表現で文字列をテスト
# fixtureユーザーに有効化トークンを追加している。
# 追加しない場合は空白になります。
# このテストがパスするには、テストファイル内のドメイン名を
# 正しく設定する必要があります
end
end
####テストのドメインホストを設定する
config/environments/test.rb
Rails.application.configure do
.
.
.
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'example.com' }
.
.
.
end
#####テスト
ubuntu:~/environment/sample_app (account-activation) $ rails test:mailers
Started with run options --seed 19781
1/1: [==============================] 100% Time: 00:00:00, Time: 00:00:00
Finished in 0.30378s
1 tests, 9 assertions, 0 failures, 0 errors, 0 skips
###演習
1.
この時点で、テストスイートが green になっていることを確認してみましょう。
ubuntu:~/environment/sample_app (account-activation) $ rails test
Running via Spring preloader in process 6539
Started with run options --seed 45227
44/44: [============================] 100% Time: 00:00:04, Time: 00:00:04
Finished in 4.49236s
44 tests, 177 assertions, 0 failures, 0 errors, 0 skips
リスト 11.20で使ったCGI.escapeの部分を削除すると、テストが red に変わることを確認してみましょう
ubuntu:~/environment/sample_app (account-activation) $ rails test
Running via Spring preloader in process 6890
Started with run options --seed 59714
ERROR["test_account_activation", #<Minitest::Reporters::Suite:0x0000562675a5dfb0 @name="UserMailerTest">, 2.0893587010000374]
test_account_activation#UserMailerTest (2.09s)
ArgumentError: ArgumentError: wrong number of arguments (given 0, expected 2..3)
test/mailers/user_mailer_test.rb:13:in `block in <class:UserMailerTest>'
44/44: [============================] 100% Time: 00:00:03, Time: 00:00:03
Finished in 3.03524s
44 tests, 175 assertions, 0 failures, 1 errors, 0 skips