Django Test Client post()返回302,尽管视图的帖子()有错误

时间:2013-06-27 20:11:22

标签: python django testing post http-status-code-404

我目前正在编写一些基本测试,以确保中等大小的Django应用程序中的页面正确地进行GET和POST。但是,使用django.test.client.Client时应该不会可靠地失败。即使我的代码中存在明显的错误,它也会返回302响应。

在我的app / urls.py中:

url(r'^mymodel/create/$', 
views.MyModelView.as_view(),
name = 'my_model_create'),

然后,为了有意创建500响应,我做了以下事情:

class MyModelCreateView(MyModelView, CreateView):

    def post(self, request, *args, **kwargs):
        print self.hello
        self.object = MyModel()
        return super(MyModelCreateView, self).post(request, *args, **kwargs)

显然,视图没有任何名为hello的对象。尝试通过浏览器发送请求时,这会按预期失败。

甚至用

代替“print self.hello”
return HttpResponse(status = 500)

然而,我仍然得到以下内容:

#We have a model called Client, so it 
#is imported as RequestClient to avoid conflicts
In [1]: from django.test.client import Client as RequestClient

In [2]: client = RequestClient()

In [3]: response = client.post("/app/mymodel/create/")

In [4]: response.status_code
Out[4]: 302

显然这里的问题出在键盘和主席之间,因为如果正确完成,Client()/ RequestClient()没有理由不返回500错误。即使出现一些问题,因为我收到302个POST请求响应而不是200个响应,但这可能是因为我们正在使用HttpRedirect。

有没有人知道这里可能存在什么问题?作为参考,我使用的是Python 2.7和Django 1.5(尽管我可能需要与Django 1.4兼容)。

1 个答案:

答案 0 :(得分:19)

为什么要获得重定向并不完全清楚,但如果您想要关注它,则需要告诉RequestClient遵循重定向 - 每the documentation

  

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

所以你的测试代码应该是这样的:

python response = client.post("/app/mymodel/create/", follow=True)

检查请求链是否值得查看其确切路由的位置。