我需要测试邮件是从 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 后端:
因此,我将其添加到 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也不能解决问题。有什么方法可以让我的测试直接使用这个后端?
使用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)
也使用first或get代替__getitem__。这是[0]打电话的神奇方法
user = User.objects.filter(id=1).first()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2899 次 |
| 最近记录: |