如何测试我的Django电子邮件视图是否可以捕获BadHeaderError?

时间:2012-09-23 02:04:40

标签: django email

我有一个带有电子邮件表单的Django视图。它允许用户键入主题和消息,并将其作为电子邮件发送给站点管理员。我想编写一个单元测试,确保此视图可以捕获BadHeaderError

subject = contact_form.cleaned_data['subject']
message = contact_form.cleaned_data['message']
try:
    mail_admins(
        subject=subject,
        message=message,
    )
except BadHeaderError:
    # I want to test this case.
    messages.error(request, "Sorry, the email could not be sent. An invalid header was found.")
else:
    messages.success(request, "Your email was sent to the admins.")

如何在单元测试中触发BadHeaderError?

我知道标题注入的规范示例是在主题中有换行符。但是,我编写了一个单元测试,用主题中的换行符填充此表单,并且没有触发无效的标题消息。

# This didn't trigger the invalid header message. So how do I do it?
response = self.client.post(reverse('contact_us'), dict(
    subject="Subject goes here\ncc:spamvictim@example.com",
    message="Message goes here",
))

修改

使用Mocker的Hassek's suggestion是我原先没有考虑的方法,并且在这里可以用于我的目的。但是,我很好奇究竟是什么触发了邮件功能中的BadHeaderError - 如果换行不这样做,主题中需要什么样的特殊字符?或者是否有其他方法来触发BadHeaderError?我不太了解网络安全,所以我想学习这些东西。

编辑2:

我使用的是Django 1.3.0。

1 个答案:

答案 0 :(得分:1)

这个片段来自Django自己的测试;这是他们测试这个错误的方法

def test_header_injection(self):
    email = EmailMessage('Subject\nInjection Test', 'Content', 'from@example.com', ['to@example.com'])
    self.assertRaises(BadHeaderError, email.message)