【发布时间】:2017-04-21 04:46:10
【问题描述】:
此模式来自 django 文档:
class SimpleTest(unittest.TestCase):
def test_details(self):
client = Client()
response = client.get('/customer/details/')
self.assertEqual(response.status_code, 200)
发件人:https://docs.djangoproject.com/en/1.8/topics/testing/tools/#default-test-client
如果测试失败,错误信息并没有太大帮助。例如,如果 status_code 是 302,那么我看到 302 != 200。
现在的问题是:错误的 HTTPResponse 是在哪里创建的?
我想查看解释器的堆栈跟踪,其中创建了错误的 HTTPResponse 对象。
我阅读了assertions of django 的文档,但没有找到匹配的方法。
更新
这是一个普遍的问题:如果断言失败,如何立即看到想要的信息?由于这些断言 (self.assertEqual(response.status_code, 200)) 很常见,我不想开始调试。
2016 年更新
我又产生了同样的想法,发现当前的答案并非 100% 容易。我写了一个新的答案,它有一个简单易用的解决方案(django web 客户端的子类):Django: assertEqual(response.status_code, 200): I want to see useful stack of functions calls
【问题讨论】:
-
你是什么意思,错误的反应? 404 告诉您 /customer/details/ 没有作为 URL 匹配,或者被调用的视图显式返回 404。
-
@DanielRoseman 是的,我是对的。状态码 404 不是很好的例子。但问题仍然存在。我将错误的状态码更改为 302。
-
通常 302 表示您错过了 url 的尾部斜杠(例如,它从
/customer/details重定向到/customer/details/)。如果没有,您需要查看视图并查看它在哪里返回重定向。测试客户端没有响应的回溯,因为生成响应时没有错误;它只是具有与您预期的不同的状态代码。 -
302 的另一个原因是您被重定向到登录页面。你可以通过打印
response['Location']来检查。 -
服务器是你的吗?也许您可以在调试模式下运行它并显示错误消息,然后如果代码不符合预期,请使用您的测试显示 URL 的输出。
标签: python django unit-testing http-response-codes