Rails Diary

プログラミングの学習記録です。

メール機能のRSpecメモ

テスト環境でもメイラーのメソッドが使える?

require "rails_helper"

RSpec.describe ArticleMailer, type: :mailer do
  let(:article_publish_wait_tomorrow) { create(:article, :article_publish_wait_tomorrow) }
  let(:article_published_yesterday) { create(:article, :article_published_yesterday) }
  let(:mail) { ArticleMailer.report_summary.deliver_now }
  let(:check_sent_mail) {
    expect(mail.present?).to be_truthy, 'メールが送信されていません'
    expect(mail.to).to eq(['admin@example.com']), 'メールの送信先が正しくありません'
    expect(mail.subject).to eq('公開済記事の集計結果'), 'メールのタイトルが正しくありません'
  }
  • テスト環境でもArticleMailer.r{作成したメール送信メソッド}.deliver_nowでメール送信ができるので、letに入れておく
  • check_sent_mail内で上で定義したmailが呼ばれるので、「メールが送信されたかどうか」「宛先」「タイトル」の検証ができる
check_sent_mail内
expect(mail.present?).to be_truthy
expect(mail.to).to eq(['admin@example.com'])
expect(mail.subject).to eq('公開済記事の集計結果')
  • 戻り値がtrue/falseのメソッドはbe_truthy/be_falseyで検証できる
  • mail.toで送信先
  • mail.subjectでタイトル
  • mail.toのeqは[]で囲まないとエラーになる

スペック内容

describe '公開済記事の集計結果通知メールの送信' do
  context '昨日までに公開された記事が存在しない場合' do
    it '昨日までに公開された記事がない旨の結果が送られること' do
      article_publish_wait_tomorrow
      check_sent_mail
      expect(mail.body).to match('0'), '公開済記事数の件数取得結果が正しくありません'
      expect(mail.body).to match('公開済の記事数: 0件'), '公開済記事数の送信フォーマットが正しくありません'
      expect(mail.body).to match('昨日公開された記事はありません'), '昨日公開された記事の件数取得結果が正しくありません'
      expect(mail.body).not_to match('タイトル: ' + article_publish_wait_tomorrow.title), '公開されていない記事のタイトルを取得しています'
      end
    end
  • 昨日公開記事がない場合のテストがしたいため、article_publish_wait_tomorrow(明日公開待ちの記事) をテストデータとして作成・投入する
  • 最初に定義したcheck_sent_mailを呼び出して、メール送信と送信先・件名を検証する
expect(mail.body).to match('0'), '公開済記事数の件数取得結果が正しくありません'
expect(mail.body).to match('公開済の記事数: 0件'), '公開済記事数の送信フォーマットが正しくあり
  • 最初この二行の意味が分からなかったけれど、一行目で公開済記事数として取得した件数が合っているかを検証、二行目でそれを表示するフォーマットが正しいかをチェックしている

参考にしたサイト

使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」 - Qiita

RSpecでActionMailerのテスト - 技術メモ

mailer spec - Mailer specs - RSpec Rails - RSpec - Relish