Тестирование почтового сервера Django

В мои settings.py я положил:

EMAIL_BACKEND = 'mailer.backend.DbBackend'

Так что даже при импорте из from django.core.mail import send_mail, send_mail Функция по-прежнему ставит в очередь электронную почту в базе данных, а не отправляет ее немедленно.

Он работает просто отлично, когда на самом деле работает веб-сайт, но при тестировании веб-сайта и доступе к некоторым веб-страницам, которые вызывают электронную почту, электронные письма больше не ставятся в очередь:

def test_something(self):
    ...
    # Check no emails are actually sent yet
    self.assertEquals(len(mail.outbox), 0) # test fails here -- 2 != 0

    # Check queued emails.
    messages = Message.objects.all()
    self.assertEquals(messages.count(), 2) # test would also fail here -- 0 != 2
    ...

Почему же он не использует серверную часть при тестировании? (импорт send_mail от mailer сама проходит тесты, но я не могу изменить импорт других почтовых приложений, таких как django-templated-email)

3 ответа

Решение

Согласно этому вопросу, Джанго отменяет setting.EMAIL_BACKEND при тестировании на 'django.core.mail.backends.locmem.EmailBackend', Это также в документации Django здесь.

Чтобы правильно проверить электронную почту с помощью django-mailer, вам нужно переопределить две настройки:

  1. Сделайте тесты для использования бэкэнда django-mailer
  2. Сделайте бэкэнд djano-mailer для использования тестового бэкенда

Если вы не установите бэкэнд django-mailer (номер 2), ваши тесты попытаются отправить электронное письмо по-настоящему.

Вам также необходимо смоделировать запуск команды управления django-mailer send_mail, чтобы вы могли проверить mail.outbox на наличие правильного адреса электронной почты.

Вот пример того, как настроить тестовый метод:

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.

Эта стратегия делает ваши тесты специфичными для django-mailer, которые вам не всегда нужны или не нужны. Лично я использую эту настройку, только когда тестирую определенные функции, включенные django-mailer. В противном случае я использую стандартную настройку тестовой электронной почты django.

Если вы действительно хотите отправлять электронные письма (например, по умолчанию) через SMTP в тестах django, используйте декоратор:

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

Попробуйте следующее:

django.core.mail.backends.console.EmailBackend
Другие вопросы по тегам