最近RSpecにも割と慣れてきて油断しているところに、見たこともないエラーが出てきて少し詰まったのでここで共有したいと思います。
リクエストスペックでmailer(パスワードのリセット処理)のテストを書いたときの話です!
##エラー内容
Failure/Error: expect(mail.body.encoded).to match user.reset_token
expected "\r\n----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9\r\nContent-Type: text/plain;\r\n charset=UTF...\nL2E+CgogIDwvYm9keT4KPC9odG1sPgo=\r\n\r\n----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9--\r\n" to match "HAY"
Diff:
@@ -1,2 +1,32 @@
-HAY
+
+----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9
+Content-Type: text/plain;
+ charset=UTF-8
+Content-Transfer-Encoding: base64
+
+SEFZCuOBggoK
+
+----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9
+Content-Type: text/html;
+ charset=UTF-8
+Content-Transfer-Encoding: base64
+
+PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgaHR0
(省略)
+L2E+CgogIDwvYm9keT4KPC9odG1sPgo=
+
+----==_mimepart_5b18de57c36e0_75293fd69de666b8448c9--
こんな感じのエラーが出てきました。
どうやらRSpecでメール本文のエンコード処理が正しくできていないせいで、期待している値と一致せずにテストに失敗しているようです。
##解決策
パスワードのリセットトークンを作る時、Base64を使ってエンコードしているので、それを元に戻して比較するとうまくいきました。(デコード)
password_resets_request_spec.rb
RSpec.describe UserMailer, type: :mailer do
let(:user) { FactoryBot.create(:user, email: 'mailer_tester@example.com') }
describe "パスワードリセット処理" do
let(:mail) { UserMailer.password_reset(user) }
# Base64 encodeをデコードして比較できるようにする
let(:mail_body) { mail.body.encoded.split(/\r\n/).map{|i| Base64.decode64(i)}.join }
it "ヘッダーが正しく表示されること" do
user.reset_token = User.new_token
expect(mail.to).to eq ["mailer_tester@example.com"]
expect(mail.from).to eq ["noreply@protuku.com"]
expect(mail.subject).to eq "パスワードの再設定"
end
# メールプレビューのテスト
it "メール文が正しく表示されること" do
user.reset_token = User.new_token
expect(mail_body).to match user.reset_token
expect(mail_body).to match CGI.escape(user.email)
end
end
end
##最後まで読んでいただきありがとうございます!
実は、この情報にたどり着くのに少し手間取ったため、記事にしました。
同じようなところで困っている方のお力になれれば幸いです!
ご指摘などあればコメントいただけますと嬉しいです。