17

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

在我的应用程序/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 兼容)。

4

1 回答 1

26

目前尚不完全清楚为什么您会收到重定向,但如果您想遵循它,您需要告诉RequestClient遵循重定向 - 根据文档

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

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

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

值得检查请求链以查看它的确切路由位置。

于 2013-06-27T22:47:47.840 回答