2016-09-14 220 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