用于发送电子邮件的 Django 测试

kni*_*irr 4 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')
Run Code Online (Sandbox Code Playgroud)

...显然,我也有适当的测试。无论如何,我什么也没有得到:

self.assertEquals(len(mail.outbox), 1)
AssertionError: 0 != 1
Run Code Online (Sandbox Code Playgroud)

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

Django 1.3:测试期间发件箱为空

因此,我将其添加到 settings.py 中:

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

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

Sar*_*iev 5

使用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')
Run Code Online (Sandbox Code Playgroud)

使用firstget代替__getitem__。这是[0]打电话的神奇方法

user = User.objects.filter(id=1).first()
Run Code Online (Sandbox Code Playgroud)