Тестирование почтового сервера 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 ответа
Чтобы правильно проверить электронную почту с помощью django-mailer, вам нужно переопределить две настройки:
- Сделайте тесты для использования бэкэнда django-mailer
- Сделайте бэкэнд 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