railsチュートリアル第１１章 送信メールのプレビュー 送信メールのテスト

###送信メールのプレビュー
テンプレートの実際の表示を簡単に確認するために、メールプレビューという裏技を使う。
Railsでは、特殊なURLにアクセスするとメールのメッセージをその場でプレビューすることができます。
これを利用するには、アプリケーションのdevelopment環境の設定に手を加える必要がある。

####development環境のメール設定
config/environments/development.rb

```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

```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による自動生成）

```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.
    # エスケープ済みメールアドレスをテスト
    # assert_matchという非常に強力なメソッドが使われています。
    #   これを使えば、正規表現で文字列をテスト
    # fixtureユーザーに有効化トークンを追加している。
    #   追加しない場合は空白になります。
    # このテストがパスするには、テストファイル内のドメイン名を
    #   正しく設定する必要があります    
  end
end
```

####テストのドメインホストを設定する
config/environments/test.rb

```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
```
2.
リスト 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
```