Django 测试客户端 post() 返回 302,尽管视图的 post() 出现错误

问题描述 投票:0回答:1

我目前正在编写一些基本测试,以确保中型 Django 应用程序中的页面正确获取和发布。 然而,使用 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 错误。 当我收到 POST 请求的 302 个响应而不是 200 个响应时,甚至会出现一些问题,但这可能是因为我们正在使用 HttpRedirect。

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

python django testing post http-status-code-404
1个回答
31
投票

尚不完全清楚为什么您会收到重定向,但如果您想遵循它,您需要告诉

RequestClient
遵循重定向 - 根据 文档:

如果您将

follow
设置为
True
,客户端将遵循任何重定向和
redirect_chain
属性将在包含以下内容的响应对象中设置 中间 url 和状态代码的元组。

所以你的测试代码应该如下所示:

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

值得检查请求链,看看它到底被路由到哪里。

© www.soinside.com 2019 - 2024. All rights reserved.