質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2234閲覧

mailerのテストに通らない。mail.body.encodedがうまくいっていない?

takuma1229

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/06/18 09:07

前提・実現したいこと

RailsでWebサービスを作っています。

Mailerのテストがうまく通ってくれません。
このあたりの実装は基本的にRailsチュートリアルを真似てやっているのですが。。。

ソースコード、テスト結果のコードは下述いたします。
なぜ通らないのかを教えていただきたいです。

程度の低い質問でしたら申し訳ございません。
また、質問に必要な情報等に不足があれば、お手数ですがご指摘いただければ、追記いたします。

よろしくお願いいたします。

###テストのエラーコード

FAIL["test_account_activation", #<Minitest::Reporters::Suite:0x000055d95a839fa8 @name="UserMailerTest">, 0.11997096299955956] test_account_activation#UserMailerTest (0.12s) Expected /Michael\ Example/ to match # encoding: US-ASCII "\r\n----==_mimepart_60cc6161ea996_22f32aecabeb595c22cf\r\nContent-Type: text/plain;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\nSGVsbG8gTWljaGFlbCBFeGFtcGxlLA0KDQpXZWxjb21lIHRvIElOVEUhIENs\r\naWNrIG9uIHRoZSBsaW5rIGJlbG93IHRvIGFjdGl2YXRlIHlvdXIgYWNjb3Vu\r\ndC4NCklOVEXjg5jjgojjgYbjgZPjgZ3vvIHkuIvjga7jg6rjg7Pjgq/jgpLj\r\ngq/jg6rjg4Pjgq/jgZfjgabjgIHjgqLjgqvjgqbjg7Pjg4jjgpLmnInlirnl\r\njJbjgZfjgabjgY/jgaDjgZXjgYTjgIINCg0KaHR0cDovL2dtYWlsLmNvbS9h\r\nY2NvdW50X2FjdGl2YXRpb25zL055VmpzUHlOTGZ4TXZpcUNqTGVOeHcvZWRp\r\ndD9lbWFpbD1taWNoYWVsJTQwZXhhbXBsZS5jb20NCg0KDQo=\r\n\r\n----==_mimepart_60cc6161ea996_22f32aecabeb595c22cf\r\nContent-Type: text/html;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\nPCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCiAgPGhlYWQ+DQogICAgPG1ldGEg\r\naHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7\r\nIGNoYXJzZXQ9dXRmLTgiIC8+DQogICAgPHN0eWxlPg0KICAgICAgLyogRW1h\r\naWwgc3R5bGVzIG5lZWQgdG8gYmUgaW5saW5lICovDQogICAgPC9zdHlsZT4N\r\nCiAgPC9oZWFkPg0KDQogIDxib2R5Pg0KICAgIDxoMT5JTlRFPC9oMT4NCg0K\r\nPHA+SGVsbG8gTWljaGFlbCBFeGFtcGxlPC9wPg0KDQo8cD5XZWxjb21lIHRv\r\nIElOVEUhIENsaWNrIG9uIHRoZSBsaW5rIGJlbG93IHRvIGFjdGl2YXRlIHlv\r\ndXIgYWNjb3VudC48L3A+DQo8cD5JTlRF44G444KI44GG44GT44Gd77yB5LiL\r\n44Gu44Oq44Oz44Kv44KS44Kv44Oq44OD44Kv44GX44Gm44CB44Ki44Kr44Km\r\n44Oz44OI44KS5pyJ5Yq55YyW44GX44Gm44GP44Gg44GV44GE44CCPC9wPg0K\r\nDQo8YSBocmVmPSJodHRwOi8vZ21haWwuY29tL2FjY291bnRfYWN0aXZhdGlv\r\nbnMvTnlWanNQeU5MZnhNdmlxQ2pMZU54dy9lZGl0P2VtYWlsPW1pY2hhZWwl\r\nNDBleGFtcGxlLmNvbSI+QWN0aXZhdGUgfCDmnInlirnljJY8L2E+DQogIDwv\r\nYm9keT4NCjwvaHRtbD4NCg==\r\n\r\n----==_mimepart_60cc6161ea996_22f32aecabeb595c22cf--\r\n". test/mailers/user_mailer_test.rb:11:in `block in <class:UserMailerTest>'

該当のソースコード

ruby

1[user_mailer_test.rb] 2require 'test_helper' 3 4class UserMailerTest < ActionMailer::TestCase 5 test "account_activation" do 6 user = users(:michael) 7 user.activation_token = User.new_token 8 mail = UserMailer.account_activation(user) 9 assert_equal "Account activation | アカウント認証", mail.subject 10 assert_equal [user.email], mail.to 11 assert_equal ["inteofficial@gmail.com"], mail.from 12 assert_match user.name, mail.body.encoded //ここで引っかかっています。 13 assert_match user.activation_token, mail.body.encoded 14 assert_match CGI.escape(user.email), mail.body.encoded 15 end

ruby

1class UserMailer < ApplicationMailer 2 3 # Subject can be set in your I18n file at config/locales/en.yml 4 # with the following lookup: 5 # 6 # en.user_mailer.account_activation.subject 7 # 8 def account_activation(user) 9 @user = user 10 mail to: user.email, subject: "Account activation | アカウント認証" 11 end 12 13 # Subject can be set in your I18n file at config/locales/en.yml 14 # with the following lookup: 15 # 16 # en.user_mailer.password_reset.subject 17 # 18 def password_reset 19 @greeting = "Hi" 20 21 mail to: "to@example.org" 22 end 23end 24

html

1[account_activation.html.erb] 2<h1>INTE</h1> 3 4<p>Hello <%= @user.name %></p> 5 6<p>Welcome to INTE! Click on the link below to activate your account.</p> 7<p>INTEへようこそ!下のリンクをクリックして、アカウントを有効化してください。</p> 8 9<%= link_to "Activate | 有効化", edit_account_activation_url(@user.activation_token, email: @user.email) %>

txt

1[account_activation.txt.erb] 2Hello <%= @user.name %>, 3 4Welcome to INTE! Click on the link below to activate your account. 5INTEヘようこそ!下のリンクをクリックして、アカウントを有効化してください。 6 7<%= edit_account_activation_url(@user.activation_token, email: @user.email) %> 8 9

yml

1[users.yml] 2michael: 3 name: Michael Example 4 email: michael@example.com 5 password_digest: <%= User.digest('password') %> 6 activated: true 7 activated_at: <%= Time.zone.now %> 8 9archer: 10 name: Sterling Archer 11 email: duchess@example.gov 12 password_digest: <%= User.digest('password') %> 13 activated: true 14 activated_at: <%= Time.zone.now %> 15 16lana: 17 name: Lana Kane 18 email: hands@example.gov 19 password_digest: <%= User.digest('password') %> 20 activated: true 21 activated_at: <%= Time.zone.now %> 22 23malory: 24 name: Malory Archer 25 email: boss@example.gov 26 password_digest: <%= User.digest('password') %> 27 activated: true 28 activated_at: <%= Time.zone.now %> 29 30<% 30.times do |n| %> 31user_<%= n %>: 32 name: <%= "User #{n}" %> 33 email: <%= "user-#{n}@example.com" %> 34 password_digest: <%= User.digest('password') %> 35 activated: true 36 activated_at: <%= Time.zone.now %> 37<% end %> 38

補足情報(FW/ツールのバージョンなど)

Rails 6.0.3
Ruby 2.6.3
AWS Cloud9を使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なぜ通らないのかを教えていただきたいです。

Railsチュートリアルが日本語メールを考慮していないからです。

対処としてはRails guidesのように
mail.body.encodedの代わりにmail.body.to_sを使うとよいと思います。
mail.text_part.body.to_sおよびmail.html_part.body.to_sを検証するとよいと思います。

投稿2021/06/18 09:36

編集2021/06/18 11:08
asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuma1229

2021/06/18 09:57

回答ありがとうございます。 >Railsチュートリアルが日本語メールを考慮していないからです。 なるほど!mail.body.to_sを試してうまくいかなかったのですが、どちらにせよメール送信時の動作もうまくいっていなかったので、メールから日本語を排除しました。 その後mail.body.encodedでテストを行ったら通りました。 ありがとうございました!
asm

2021/06/18 11:09

よく見たらマルチパートなのですね。 その場合はbodyの代わりにtext_part.body/html_part.bodyを使わないといけませんね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問