2013-04-24 82 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 
    ... 

为什么它似乎并没有在测试时使用后端? (从mailer进口send_mail本身获得测试通过,但我真的不能改变其他的邮件应用程序的进口喜欢django-templated-email

+0

仅供参考,请参阅http://stackoverflow.com/questions/11919118/replace-django-core-mail-send-mail-across-all-apps。 – alecxe 2013-04-24 08:45:31

+0

@AlexanderAfanasiev是的,我用'runserver'运行网站时已经有了后端工作;无论出于何种原因,它在进行单元测试时都不起作用。 – wrongusername 2013-04-24 17:45:19

回答

14

根据这一question Django的测试,以'django.core.mail.backends.locmem.EmailBackend'当覆盖setting.EMAIL_BACKEND。它也在django文档here中。

+3

了解它与这个答案工作:http://stackoverflow.com/a/15053970/257583。非常感谢!! – wrongusername 2013-04-26 22:42:57

3

要正确测试电子邮件Django的邮件,你需要重写两种设置:

  1. 让测试使用Django的邮件后端
  2. 充分利用djano-邮件后端使用测试后端

如果您没有设置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的邮件,你不要总是想要或需要。我个人仅在使用django-mailer启用特定功能时才使用此设置。否则,我使用由django设置的默认测试电子邮件后端。