首页 > 解决方案 > 在 Django 中对电子邮件进行单元测试

问题描述

Django 2.0.6

我的 Django 应用程序中有一些单元测试。其中一项测试需要验证电子邮件是否已发送。我怎样才能做到这一点?

我通过 django.core.mail 阅读了关于测试电子邮件发送和一般电子邮件发送的 django 文档,但不知何故我仍然不明白发生了什么以及为什么会这样发生。

希望我能尽可能准确地解释它,所以我们开始吧:

在我的测试用例中,我有一个实例并用它调用一个函数。被调用的函数正在创建和格式化一个 E-Mail 实例,并通过它发送 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 类的方法):

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

标签: pythondjangoemail

解决方案


我有解决方案,但我不确定如何在这里发布,但无论如何。问题是用户 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)

这行得通。非常感谢。


推荐阅读