2013-04-24 18 views
5

Nel mio settings.py, ho messo:test Django email backend

EMAIL_BACKEND = 'mailer.backend.DbBackend' 

Così, anche quando l'importazione da from django.core.mail import send_mail, la funzione send_mail accoda ancora in piedi l'e-mail nel database invece di inviarlo immediatamente.

Funziona bene quando effettivamente in esecuzione il sito web, ma durante il test del sito, e l'accesso alcune pagine web che attivano messaggi di posta elettronica, messaggi di posta elettronica non sono più in coda più:

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

Come mai non sembra stai usando il backend quando sta testando? (Importazione send_mail da mailer si ottiene i test di passare, ma non può davvero cambiare le importazioni di altre applicazioni come mailing django-templated-email)

+0

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

+0

@AlexanderAfanasiev sì, ho il backend in funzione quando eseguo il sito web con 'runserver'; semplicemente non funziona quando si effettuano i test unitari, per qualsiasi motivo. – wrongusername

risposta

14

Secondo questa question Django sostituisce il setting.EMAIL_BACKEND quando si prova a 'django.core.mail.backends.locmem.EmailBackend'. È anche nei documenti django here.

+3

Funziona con questa risposta: http://stackoverflow.com/a/15053970/257583. Grazie molto!! – wrongusername

3

Per testare correttamente e-mail con django-mailer, è necessario eseguire l'override due impostazioni:

  1. Effettuare i test per usare il backend django-mailer
  2. Fai il backend djano-mailer per usare il backend di prova

Se non si imposta il backend di django-mailer (numero 2), i test proveranno a inviare l'e-mail per davvero.

È inoltre necessario simulare l'esecuzione del comando di gestione send_mail di django-mailer in modo da poter controllare mail.outbox per l'e-mail corretta.

Ecco un esempio di come impostare un metodo di prova:

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. 

Questa strategia rende i test specifici per Django-mailer che non sempre desidera o necessità. Io personalmente uso questa configurazione solo quando sto testando una funzionalità specifica abilitata da django-mailer. Altrimenti, utilizzo la configurazione di backend e-mail di prova predefinita di django.