2016-09-14 153 views
1

我需要测试该邮件是从Django 1.8应用程序发送的;文件清楚说明如何做到这一点,例如Django测试发送电子邮件

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也没有解决该问题。有没有什么方法可以让我的测试直接使用这个后端?

回答

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() 
+0

道歉的延迟回复,并感谢您的答案。不幸的是我仍然有问题,所以也许除了电子邮件后端设置以外还有其他问题。尽管如此,它可能并不完全清楚。 – knirirr

+0

看起来我设法让一封电子邮件工作。看起来用户对象没有正常工作(可能是夹具的问题)。当我在设置中使用您的修复和发送邮件时,并未先尝试加载用户时,我得到一个通过。 – knirirr