2013-04-24 15 views
5

W moim settings.py, kładę:Testowanie Django email backend

EMAIL_BACKEND = 'mailer.backend.DbBackend' 

Więc nawet podczas importowania z from django.core.mail import send_mail funkcja send_mail nadal kolejek się e-mail w bazie danych zamiast wysyłać go natychmiast.

To działa dobrze, gdy uruchomiony na stronie internetowej, ale podczas testowania stronie internetowej, i dostępu do pewnych stron internetowych, e-maili, które powodują, e-maile nie są już w kolejce już:

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 
    ... 

Jak to się stało, że nie wydaje się korzystać z zaplecza podczas testowania? (Importowanie send_mail z mailer sama dostaje testy przekazać, ale nie mogę zmienić importu innych aplikacji mailowych jak django-templated-email)

+0

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

+0

@AlexanderAfanasiev Tak, mam serwer działający podczas uruchamiania witryny z 'runserver'; po prostu nie działa przy wykonywaniu testów jednostkowych z jakiegokolwiek powodu. – wrongusername

Odpowiedz

14

Według tego question Django nadpisuje setting.EMAIL_BACKEND podczas testowania do 'django.core.mail.backends.locmem.EmailBackend'. Jest także w dokumentach django here.

+3

Gotowy do pracy z tą odpowiedzią: http://stackoverflow.com/a/15053970/257583. Wielkie dzięki!! – wrongusername

3

Aby prawidłowo przetestować mail z django-Mailer, trzeba zastąpić dwa ustawienia:

  1. Wykonać testy do korzystania z zaplecza django-mailera
  2. Bądź backend djano-mailera używać backendu testową

Jeśli nie ustawisz backendu django-mailer (numer 2), twoje testy będą próbowały wysłać wiadomość e-mail w rzeczywistości.

Należy również przeprowadzić symulację polecenia send_mail zarządzania poleceniem django-mailer, aby można było sprawdzić mail.outbox pod kątem poprawnego adresu e-mail.

Oto przykład jak skonfigurować metody badania:

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. 

Taka strategia sprawia, że ​​testy specyficzne dla Django przesyłkę, która nie zawsze chcą lub muszą. Osobiście używam tej konfiguracji tylko wtedy, gdy testuję określoną funkcjonalność włączoną przez django-mailer. W przeciwnym razie używam domyślnego ustawienia backendu testowego przez django.