测试 Django 电子邮件后端

Posted

技术标签:

【中文标题】测试 Django 电子邮件后端【英文标题】:Testing Django email backend 【发布时间】:2013-04-17 16:50:24 【问题描述】:

在我的 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
    ...

为什么它在测试时似乎没有使用后端? (从mailer 导入send_mail 本身可以通过测试,但我无法真正更改其他邮件应用程序的导入,例如django-templated-email

【问题讨论】:

@AlexanderAfanasiev 是的,当使用runserver 运行网站时,我的后端工作正常;无论出于何种原因,它在进行单元测试时都不起作用。 【参考方案1】:

据此question django 在测试'django.core.mail.backends.locmem.EmailBackend' 时会覆盖setting.EMAIL_BACKEND。它也在 django 文档here。

【讨论】:

得到了这个答案:***.com/a/15053970/257583。非常感谢!!【参考方案2】:

要使用 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 的默认测试电子邮件后端设置。

【讨论】:

【参考方案3】:

如果您真的想在 django 测试中通过 SMTP 发送电子邮件(如默认),请使用装饰器:

from django.test.utils import override_settings    

@override_settings(EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
class TestEmailVerification(TestCase):
   ...

【讨论】:

【参考方案4】:

尝试以下方法:

django.core.mail.backends.console.EmailBackend

【讨论】:

与七年前的the accepted answer 中所述的django.core.mail.backends.locmem.EmailBackend 相比,这有什么好处?

以上是关于测试 Django 电子邮件后端的主要内容,如果未能解决你的问题,请参考以下文章

带有本地 smtp 的 Django 电子邮件后端

如何在 Django 中为 EmailMultiAlternatives 自定义电子邮件后端

django多后端发送邮件

Django 发送邮件

在 Django 中测试电子邮件发送 [关闭]

Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件