Django测试发送电子邮件

时间:2016-09-14 14:59:56

标签: django

我需要测试从Django 1.8应用程序发送的邮件;文档清楚说明如何执行此操作,例如

https://docs.djangoproject.com/en/dev/topics/testing/tools/#email-services

这里有一些代码应该足够了:

from myapp.utils.mailutils import mail as mymail
from django.core import mail

def testThisFails(self):
    user = User.objects.filter(id=1).__getitem__(0)
    mymail(user,'Test Message','Test message content, please ignore...')
    self.assertEquals(len(mail.outbox), 1)
    self.assertEquals(mail.outbox[0].subject, 'Test Message')

......显然,我也有适当的测试。无论如何,除了这个我什么也得不到:

self.assertEquals(len(mail.outbox), 1)
AssertionError: 0 != 1

这是一个类似的问题,提到需要使用locmail后端:

Django 1.3: Outbox empty during tests

所以,我把它添加到了settings.py:

TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
if TESTING:
    EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

......没有运气。即使省略if TESTING也无法解决问题。有没有办法可以让我的测试直接使用这个后端?

2 个答案:

答案 0 :(得分:1)

使用self.settings上下文管理器覆盖设置

def testThisFails(self):
    # do first here
    user = User.objects.filter(id=1).__getitem__(0)
    with self.settings(EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend'):
        mymail(user,'Test Message','Test message content, please ignore...')
        self.assertEquals(len(mail.outbox), 1)
        self.assertEquals(mail.outbox[0].subject, 'Test Message')

使用firstget代替__getitem__。这是进行[0]调用的神奇方法

user = User.objects.filter(id=1).first()

答案 1 :(得分:0)

对我来说,我在time.sleep(0.1)之前使用了self.assertEquals(len(mail.outbox), 1)