【问题标题】:Django Test Client post() returns 302 despite error on view's post()尽管视图的 post() 出错,Django 测试客户端 post() 返回 302
【发布时间】:2013-06-25 11:53:29
【问题描述】:

我目前正在编写一些基本测试,以确保中型 Django 应用程序中的页面正确 GET 和 POST。但是,使用 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 兼容)。

【问题讨论】:

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


    【解决方案1】:

    目前尚不完全清楚您收到重定向的原因,但如果您想关注它,您需要告诉 RequestClient 关注重定向 - 每 the documentation

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

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

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

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

    【讨论】:

    • 这确实做了一些事情 - 它返回 200,但它仍然没有我正在寻找的行为。 MyModelCreateView 的 post() 方法的第一行显然是“返回 HttpResponse(status = 500)”。它不应该通过那个 post() 方法,接收 500 响应,然后自动返回该响应吗?即使它返回一个有效的 POST 响应,我也不能用它来测试它是否在必要时不会失败,遗憾的是......
    • 是的,某些配置与您的预期不同。 redirect_chain 中有什么?
    • 啊哈,我开始看到问题了。 [('testserver/app/mymodel/create', 301), ('testserver/accounts/login/?next=/app/mymodel/create', 302)] 是我的输出。这是登录的重定向让我感到困惑。尽管如此,这些都不是 200 响应 - 是因为它正确重定向所以发送了一个面向 POST 的 OK?
    • @masahane 你解决过这个问题吗?我也有同样的问题。
    • 是的。就我而言,这是因为我没有登录,所以我被重定向到登录页面。 Hamish 关于重定向链的评论帮助我调试了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-03-09
    • 2013-12-19
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多