python - 在 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()
解决方案
我有解决方案,但我不确定如何在这里发布,但无论如何。问题是用户 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)
这行得通。非常感谢。
推荐阅读
- django - django orm 内部连接组按数据
- c# - 如何根据该行的 ID 从列表中删除该行?
- entity-framework-core - 如何使用 Azure Functions(计时器触发器)和 azure sql 配置 Entity Famework Core?
- c - 为什么编译器不断给出“错误:预期的标识符或'('在')'标记之前”?
- python-3.x - Model.fit 中自定义生成器的 Tensorflow Keras 问题
- css - .css 更改回原始设置的问题
- javascript - navigator.onLine 布尔属性
- node.js - EROFS:只读文件系统,mkdir /test NodeJS
- javascript - 在 HTML 中将输入发布到 PHP
我对 HTML、PHP 和 javascript 还是很陌生。所以我正在开发一个简单的音乐搜索网站。所以基本上在输入关键字后,我的网站会显示一个可能的结果列表,然后单击结果会将我重定向到音乐播放器并开始播放音乐。
这是我的 HTML 文件: