Djangoでemail送信をテストする

先日、gmailを使ってdjangoからemailを送信する設定なんかを調べました。


今日は関連して「view関数などでemail送信している場合、ユニットテストを実行するたびに送信されてしまうのか?」と思ったので調べてみました。


結論を先に書きますと、python manage.py test でテスト実行している場合、django.core.mailでのメール送信は実行されません。


以下がテストのサンプルになります。

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


class EmailTest(TestCase):

    def test_send_email(self):
        # メッセージ送信
        mail.send_mail(u'指原莉乃、移籍はHKTがかわいそう?! /あなたの愛車、今いくら?',
                       u'ながーい本文',
                       'from@example.com',
                       ['to@example.com'],
                       fail_silently=False)

        # メッセージが1つ送信されたこと
        self.assertEqual(len(mail.outbox), 1)

        # メッセージのタイトルが正しいこと
        self.assertEqual(mail.outbox[0].subject, u'指原莉乃、移籍はHKTがかわいそう?! /あなたの愛車、今いくら?')


django.core.mail.outboxが送信されるメールを保持し、実際には送信されません。
送信内容の確認はoutboxをチェックします。


ちなみに、outboxはテスト実行時に動的に追加されるプロパティなので、上記テストコードをpycharmなどで編集していると、「Cannot find reference」みたいな警告がでたりします。
気にせず実行しましょう。