如何使用HTTPResponseRedirect对django消息进行单元测试?

时间:2015-12-22 23:09:31

标签: python django unit-testing django-messages

Just like this question... but harder.

我有一个视图,重定向用户,并使用Django messages framework将它们发送到正确的页面,并添加一个包含如下代码的消息:

def new_comment(request,pid):
    post = get_object_or_404(DiscussionPost,pk=pid)
    if post.closed:
        messages.error(request, _('This post is closed. Your comment was not added.'))
        return HttpResponseRedirect(reverse("discussionsPost",args=[post.pk]))

现在这对用户来说效果很好,但是当测试消息不可用时。

在单元测试中我做了:

    response = self.client.post(reverse('aristotle:discussionsPostNewComment',args=[p1.id]),
        {'body':"Post is closed, so I can NOT comment."}
    )
    #the below assertion passes
    self.assertRedirects(response,reverse('aristotle:discussionsPost',args=[p1.id]))

    print response
    print response.context['messages']       

第一张照片给出了:

Vary: Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=utf-8
Location: http://testserver/discussions/post/1
Content-Language: en

第二次失败并出现错误:

Traceback (most recent call last):
  File "/home/ubuntu/workspace/aristotle_mdr/tests/main/test_discussions.py", line 393, in test_post_to_closed_discussion
    print response.context['messages']
TypeError: 'NoneType' object has no attribute '__getitem__'

另外,由于没有可以使用的请求项,因此无法使用messages.get_messages

由于HTTPResponseRedirect中没有上下文字典,如何检查邮件是否已正确发送?

1 个答案:

答案 0 :(得分:5)

如果你想在重定向之后测试响应,那么你需要告诉Django测试客户端通过follow参数“跟随”重定向链。如Django documentation中所述:

  

如果将follow设置为True,客户端将遵循任何重定向,并且将在包含中间URL和状态代码元组的响应对象中设置redirect_chain属性。

所以你的测试帖需要看起来像:

    response = self.client.post(
        reverse('aristotle:discussionsPostNewComment', args=[p1.id]),
        {'body':"Post is closed, so I can NOT comment."},
        follow=True
    )