2013-04-24 5 views
5

В моей settings.py, я поставил:Тестирование Django электронной почты бэкенд

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)

+0

FYI, см. Http://stackoverflow.com/questions/11919118/replace-django-core-mail-send-mail-across-all-apps. – alecxe

+0

@AlexanderAfanasiev yes У меня есть бэкэнд, работающий при запуске сайта с 'сервером запуска '; он просто не работает при выполнении модульных тестов по любой причине. – wrongusername

ответ

14

Согласно этому question Джанго перекрывает setting.EMAIL_BACKEND при тестировании на 'django.core.mail.backends.locmem.EmailBackend'. Это также в django docs here.

+3

Получил эту работу с этим ответом: http://stackoverflow.com/a/15053970/257583. Большое спасибо!! – wrongusername

3

Чтобы правильно проверить электронную почту с Джанго-почтовиком, вам необходимо изменить два параметра:

  1. Выполните тесты, чтобы использовать Джанго-мэйлер бэкенд
  2. Сделать djano-мэйлер бэкенд использовать тест бэкенд

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

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

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

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.