我目前正在编写一些基本测试,以确保中型 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 兼容)。
尚不完全清楚为什么您会收到重定向,但如果您想遵循它,您需要告诉
RequestClient
遵循重定向 - 根据 文档:
如果您将
设置为follow
,客户端将遵循任何重定向和True
属性将在包含以下内容的响应对象中设置 中间 url 和状态代码的元组。redirect_chain
所以你的测试代码应该如下所示:
response = client.post("/app/mymodel/create/", follow=True)
值得检查请求链,看看它到底被路由到哪里。