読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【126日目】【1日20分のRailsチュートリアル】【第10章】メールプレビューのテストを作成する

Ruby on Railsチュートリアル(第3版)

今日は「10.1.2 AccountActivationsメイラーメソッド」のメールプレビューのテストを作成するところから。

10.1.2 AccountActivationsメイラーメソッド

最後に、このメールプレビューのテストも作成して、プレビューをダブルチェックできるようにします。

テスト例がRailsによって自動生成されているので、これを利用してテストを作成する。

元々あった"password_reset"のテストは今は要らないと思うのでコメントアウトした。

test/mailers/user_mailer_test.rb

  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
  end

このテストがパスするには、テストファイル内のドメイン名を正しく設定する必要があります (リスト10.19)。

テストで送り元のメールアドレス(mail.from)見てるけど、メールアドレスなんてどこで設定してるんだろうと思ってた。
テスト向けにはここで設定するのかー。

config/environments/test.rb

  config.action_mailer.default_url_options = { host: 'example.com' }

これでテスト通りました。

$ bundle exec rake test:mailers
1 tests, 9 assertions, 0 failures, 0 errors, 0 skips

あとはユーザー登録を行うcreateアクションに数行追加するだけで、メイラーをアプリケーションで実際に使うことができます。

createアクションのユーザー新規作成時の処理を変更。

変更前は、ユーザーのプロファイルページ (7.4) にリダイレクトしていましたが、アカウント有効化を実装するうえでは無意味な動作なので、リダイレクト先をルートURLに変更してあります。

アカウント有効化してもらわないとプロファイルページにリダイレクトしても見れない…かな…。無意味ですね。

app/controllers/users_controller.rb

  :
  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.account_activation(@user).deliver_now
      flash[:info] = "Please check your email to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end
  :

リスト10.21ではリダイレクト先をプロファイルページからルートURLに変更し、かつユーザーは以前のようにログインしないようになっています。
(中略)
失敗が発生するテストの行をひとまずコメントアウトしておきます (リスト10.22)。コメントアウトした部分は、10.1.4でアカウント有効化のテストをパスさせるときに元に戻します。

アプリケーションの挙動変えちゃったもんね。

test/integration/users_signup_test.rb

    :
    # assert_template 'users/show'
    # assert is_logged_in?

コメントアウトした状態でテストが通ることを確認。

$ bundle exec rake test
43 tests, 175 assertions, 0 failures, 0 errors, 0 skips

この状態で実際に新規ユーザーとして登録してみると、リダイレクトされて図10.4のようになり、リスト10.23のようなメールが生成されます。

新規ユーザーを登録してみよう。

サーバーを起動して

$ rails server -b $IP -p $PORT

適当なユーザー名とメールアドレスとパスワードでユーザー登録。

f:id:kt_zoe:20170329123442p:plain

flashメッセージ表示されました!

ただし、実際にメールが生成されるわけではないのでご注意ください。

実際にメール送信されるならメールアドレスはちゃんとしたの使わないとな、と思ってた。実際のメール送信はまだなにか必要なのか。

ここに引用したのはサーバーログに出力されたメールです。

長いから引用はしないけどサーバー起動したターミナルにメール内容出力されてた。処理は動いてそうだね。

今日の学習時間は【26分】

メイラーメソッド使う準備するの長かった…。

次は「10.1.3 アカウントを有効化する」から。