【问题标题】:Unittesting Emails in Django在 Django 中对电子邮件进行单元测试
【发布时间】: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()

【问题讨论】:

  • 你还没有显示Email是什么。
  • 您的第一个函数调用send_email_to_teachers_preferences_link(),但这不是您显示的其他函数之一的名称。另外请给出以test_ 开头的单元测试名称,而不是任何非测试函数。
  • 我不明白send 函数是什么。它是Email 类的方法吗?如果是这样,你应该这样展示它。该函数只是将Email() 实例保存到数据库中,因此不清楚您为什么希望它发送电子邮件。要实际发送电子邮件,请使用 send_mail 或类似名称。
  • 也许this 会有所帮助。

标签: python django email


【解决方案1】:

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

这行得通。非常感谢。

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2013-04-17
    相关资源
    最近更新 更多