djangoでsend_mailのテストをする

djangoではsend_mailで簡単にメール送信ができます。
以下はドキュメントにある最もシンプルな例です。

from django.core.mail import send_mail

send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

件名や文面や送信先などをを動的に取得、生成していて、その内容をテストしたい場合どうするのかなと思って調べたのでメモしておきます

最初はsend_mailをmockにする手を考えました

ですが調べたところ、djangoはテスト実行中にsend_mailでメールを送信することはなく、代わりに django.core.mail.outboxに送信内容を保持するということでした

なのでmockの作成などしなくても、送信処理後にoutboxの内容を確認することができます

from django.test import TestCase
from django.core import mail


class SendMailTestCase(TestCase):

    def test_do_something_and_send_email(self):
        do_something_and_send_email()
        self.assertEquals(mail.outbox[0].subject, 'Subject here')
        self.assertEquals(mail.outbox[0].body, 'Here is the message.')

簡単ですね