Testing Django email backend

To properly test email with django-mailer, you need to override two settings:

  1. Make the tests to use the django-mailer backend
  2. Make the djano-mailer backend to use the test backend

If you don't set the django-mailer backend (number 2), your tests will try to send the email for real.

You also need to simulate running django-mailer's send_mail management command so that you can check mail.outbox for the correct email.

Here's an example of how to setup a test method:

from mailer.engine import send_all

@override_settings(EMAIL_BACKEND='mailer.backend.DbBackend')
@override_settings(MAILER_EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend')
def test_email(self):
    # Code that generates email goes here.

    send_all()  # Simulates running django-mailer's send_mail management command.

    # Code to check the email in mail.outbox goes here.

This strategy makes your tests specific to django-mailer which you don't always want or need. I personally only use this setup when I'm testing specific functionality enabled by django-mailer. Otherwise, I use the default test email backend setup by django.


According to this question django overrides the setting.EMAIL_BACKEND when testing to 'django.core.mail.backends.locmem.EmailBackend'. It's also in the django docs here.


If you really want have sending of emails (like default) via SMTP in django tests use the decorator:

from django.test.utils import override_settings    

@override_settings(EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
class TestEmailVerification(TestCase):
   ...