【发布时间】:2019-01-29 20:21:54
【问题描述】:
Django 2.0.6
我的 Django 应用中有一些单元测试。其中一项测试需要验证电子邮件是否已发送。我怎样才能做到这一点?
我通过 django.core.mail 阅读了关于测试电子邮件发送和一般电子邮件发送的 django 文档,但不知何故我仍然不明白发生了什么以及为什么会这样发生。
希望我能尽可能准确地解释它,所以我们开始吧:
在我的测试用例中,我有一个实例并用它调用一个函数。被调用的函数正在创建和格式化一个电子邮件实例,并通过Email.send(email, '', '', subject, content) 发送它
函数调用完成后,我使用mail.outbox 检查是否有电子邮件但没有,但为什么呢?如果我尝试通过mail.send_mail(...) 手动执行此操作,然后检查发件箱,它可以工作。我还通过打印语句检查了应该调用的函数实际上被调用了。
我只想看到邮件已成功发送。
这是我的代码
def test_send_email_to_teacher(self):
# Generate test data
self.instance.send_email_to_teacher()
print(len(mail.outbox))
#self.assertEqual(len(mail.outbox), 1)
这就是功能
def send_email_to_teacher(self):
for group in self.practicegroup_set.all():
group.send_email_to_teacher()
这个函数调用这个:
def send_email_to_teacher(self):
link = reverse('sometext', args=[self.get_preferences_token_for_teacher()])
link = settings.BASE_URL + str(link)
Email.send_preferences_link(self.teacher.email, link)
这个函数调用这个:
def send_preferences_link(email, link):
content = Email.load_email_template('sometext')
content = content.replace('##LINK##', link)
subject = "also some text"
Email.send(email, '', '', subject, content)
电子邮件实例是:
class Email(models.Model):
to = models.TextField(null=True, blank=True)
cc = models.TextField(null=True, blank=True)
bcc = models.TextField(null=True, blank=True)
sender = models.CharField(max_length=255)
subject = models.CharField(max_length=255)
text = models.TextField(null=True, blank=True)
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True)
date_send = models.DateTimeField(null=True, blank=True)
Email“发送”功能(Email类方法):
def send(to, cc, bcc, subject, content):
email = Email()
email.to = to
email.cc = cc
email.bcc = bcc
email.subject = subject
email.text = content
email.sender = settings.EMAIL_SENDER
email.save()
【问题讨论】: