我有一个带有电子邮件表单的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。
答案 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)