在Django中对电子邮件进行单元测试

时间:2018-08-23 12:40:06

标签: python django email

Django 2.0.6

我的Django应用程序中有一些单元测试。其中一项测试需要验证电子邮件是否已发送。我该如何实现?

我阅读了有关测试电子邮件发送和通过django.core.mail在Generall中发送电子邮件的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)

电子邮件“发送”功能(电子邮件类的方法):

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()

1 个答案:

答案 0 :(得分:0)

我有解决方案,但是我不确定如何在此处发布它,但是无论如何。问题出在用户Alasdair提到我的发送方法只是将电子邮件实例保存到数据库中而没有实际发送。因此,我不得不从数据库中检索实例并通过send_mail发送它:

def test_send_email_to_teachers_preferences_link(self)
        returnvalue = self.sem_18s_bsc_pp1.send_email_to_teacher()
        email = Email.objects.get(subject="sometext")
        mail.send_mail(
            email.subject,
            email.text,
            'test@test.de',
            ['jj@jj.de'],
            fail_silently=False,
        )
        self.assertEqual(len(mail.outbox), 1)

这有效。非常感谢。