テスト環境でもメイラーのメソッドが使える?
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