unit testing a routine that sends mail
phlip2005 at gmail.com
Thu Feb 18 21:16:03 CET 2010
> I have a routine that sends an email (this is how a Django view
> notifies me that an event has happened). I want to unit test that
Are you opening SMTP and POP3 sockets??
If you are not developing that layer itself, just use Django's built-
in mock system. Here's my favorite assertion for it:
def assert_mail(self, funk):
from django.core import mail
previous_mails = len(mail.outbox)
mails = mail.outbox[ previous_mails : ]
assert  != mails, 'the called block should produce emails'
if len(mails) == 1: return mails
You call it a little bit like this:
missive = self.assert_mail( lambda:
Then you can use assert_contains on the missive.body, to see what mail
got generated. That's what you are actually developing, so your tests
should skip any irrelevant layers, and only test the layers where you
yourself might add bugs.
More information about the Python-list