在Django中测试邮件发送
我需要测试我的Django应用程序发送的电子邮件内容是否正确。我不想依赖外部系统(比如临时的gmail账户),因为我并不是在测试实际的电子邮件服务……
我想,也许可以把发送的电子邮件保存在本地的一个文件夹里。有什么建议可以实现这个吗?
10 个回答
28
如果你对单元测试感兴趣,最好的办法就是使用Django提供的内存后端。
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
举个例子,如何把它当作py.test的一个工具来用。
@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
在每个测试中,mail.outbox
会和服务器一起重置,这样就不会在测试之间产生影响。
from django.core import mail
def test_send(self):
mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
assert len(mail.outbox) == 1
def test_send_again(self):
mail.send_mail('subject', 'body.', 'from@example.com', ['to@example.com'])
assert len(mail.outbox) == 1
217
Django的测试框架里有一些内置的工具,可以帮助你进行电子邮件服务的测试。
下面是文档中的一个例子(简短版):
from django.core import mail
from django.test import TestCase
class EmailTest(TestCase):
def test_send_email(self):
mail.send_mail('Subject here', 'Here is the message.',
'from@example.com', ['to@example.com'],
fail_silently=False)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Subject here')
49
你可以使用一种叫做“文件后端”的方法来发送邮件,这个方法在开发和测试的时候非常方便。这样做的话,邮件不会真正发送出去,而是会保存在你指定的一个文件夹里!