我需要测试从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
也无法解决问题。有没有办法可以让我的测试直接使用这个后端?
答案 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')
使用first
或get
代替__getitem__
。这是进行[0]
调用的神奇方法
user = User.objects.filter(id=1).first()
答案 1 :(得分:0)
对我来说,我在time.sleep(0.1)
之前使用了self.assertEquals(len(mail.outbox), 1)