技術メモ

マジメモ。多少雑多でも学んだこと書きます。

RSpecでActionMailerのテスト

RSpecのSystemSpec内でメール送信のテストを行う際のメモ。


mailers/article_mailer.rb

class ArticleMailer < ApplicationMailer
  def report
    mail(to: 'admin@example.com', subject: 'HOGE')
  end
end

送信メールを上のように定義。

テスト環境でもArticleMailer.report.deliverでメール送信できるので

letに入れて書くと、

mailer_spec.rb

require 'rails_helper'

RSpec.describe "Mailer", type: :system do
  let(:mail) { ArticleMailer.report_summary.deliver }
  let(:check_sent_mail) {
    expect(mail.present?).to be_truthy, 'メールが送信されていません'
    expect(mail.to).to eq(['admin@example.com']), 'メールの送信先が正しくありません'
    expect(mail.subject).to eq('HOGE'), 'メールのタイトルが正しくありません'
  }

  describe 'メールの送信' do
    context 'メールを送信した場合' do
      it 'タイトル、メールアドレスが正しく送信される' do
        check_sent_mail
      end
    end
  end
end

check_sent_mail内でlet(:mail)も呼ばれるので、

メール送信+検証ができる。


mail.to送信先

mail.subjectでタイトル

mail.fromで送信元

mail.bodyで本文を参照。



開発環境ではgem letter_opener_webを使用して/letter_opener内で確認してたので

SystemSpec内でもvisit '/letter_opner'で飛ぼうとして飛べなくて

ハマってたのでメモ。