测试Django电子邮件后端
在my settings.py中,我将:测试Django电子邮件后端,django,unit-testing,testing,django-mailer,Django,Unit Testing,Testing,Django Mailer,在my settings.py中,我将: EMAIL_BACKEND = 'mailer.backend.DbBackend' 因此,即使从django.core.mail import send_mail导入时,send_mail功能仍会在数据库中对电子邮件进行排队,而不是立即发送 它在实际运行网站时工作正常,但在测试网站和访问一些触发电子邮件的网页时,电子邮件不再排队: def test_something(self): ... # Check no emails are
EMAIL_BACKEND = 'mailer.backend.DbBackend'
因此,即使从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\u mail
可以通过测试,但我无法真正更改其他邮件应用程序的导入,如django模板电子邮件
)根据此,当测试到'django.core.mail.backends.locmem.EmailBackend'
时,django会覆盖设置.EMAIL\u BACKEND
。它也在django文档中。要使用django mailer正确测试电子邮件,您需要覆盖两个设置:
进行测试以使用django mailer后端
使djano mailer后端使用测试后端
如果您没有设置django mailer后端(2号),您的测试将尝试真正发送电子邮件
您还需要模拟运行django mailer的send_mail management命令,以便检查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的默认测试电子邮件后端设置。如果您确实希望在django测试中通过SMTP发送电子邮件(如默认),请使用decorator:
from django.test.utils import override_settings
@override_settings(EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
class TestEmailVerification(TestCase):
...
请尝试以下操作:
django.core.mail.backends.console.EmailBackend
@AlexanderAfanasiev是的,当使用runserver运行网站时,我已经让后端工作了;无论出于什么原因,在进行单元测试时,它都不起作用。非常感谢!!与七年前的文章中所阐述的相比,django.core.mail.backends.locmem.EmailBackend
有什么好处?