Python 测试django:意外http状态代码的原因

Python 测试django:意外http状态代码的原因,python,django,unit-testing,httprequest,Python,Django,Unit Testing,Httprequest,我们的django应用程序中有许多Unitest 但如果由于状态代码不匹配而导致测试失败: Traceback (most recent call last): File "/home/foo_eins_di514/src/foo-time/foo_time/tests/EditTest.py", line 813, in test_web_entry_with_unclassified_activity self.assertEqual(200, response.status_c

我们的django应用程序中有许多Unitest

但如果由于状态代码不匹配而导致测试失败:

Traceback (most recent call last):
  File "/home/foo_eins_di514/src/foo-time/foo_time/tests/EditTest.py", line 813, in test_web_entry_with_unclassified_activity
    self.assertEqual(200, response.status_code, url)
  File "/usr/lib64/python2.7/unittest/case.py", line 494, in assertEqual
    assertion_func(first, second, msg=msg)
  File "/usr/lib64/python2.7/unittest/case.py", line 487, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: /foo_eins_di514/modtime/calendar/entry/view/172/
。。。。完全不知道在哪里创建了错误的退出状态

在大型应用程序中,由于退出状态也可以在中间件中创建,因此可能需要一些时间才能找到问题的根源

有什么提示可以让这个更容易测试吗

测试如下所示:

url=reverse(view_name, kwargs=dict(id=entry.id))
response=client.get(url)
self.assertEqual(200, response.status_code, url)

我使用此解决方案来发现问题:

import django
django.http.response.HttpResponseBase.__init__=None
response=client.get(url)
这会产生一个stacktrace,在这里我可以看到HttpResponse是在哪里创建的


当然,这只是调试的临时解决方案。我对mock也做了同样的尝试,但失败了,因为我还不是mock专家。

您将
assertEqual
中有用的消息替换为不太有用的消息,即失败的URL(第三个参数是
assertEqual

之所以这样做,是因为相同的测试方法测试多个URL。这是一种糟糕的做法。每种测试方法都应该测试一件事。DRY不适用于单元测试(或者至少更重要的是,每个测试方法只测试一件事情)

如果你知道令人不快的状态码,那么从哪里找到它就更明显了。假设是404,那么,可能是找不到对象,可能是300多个,可能是您没有适当的权限,被重定向到登录页面

任何真正的编程错误都会以正常异常和有用的堆栈跟踪失败

如果您关心特定视图中的逻辑,请将逻辑拆分为多个可测试单元

在这种特殊的情况下,我的钱将在坏的PK或丢失权限虽然

关于你的嘲弄,请尝试以下方式:

with patch.object(HttpResponseBase, '__init__', None):
    response = client.get(url)

听起来您应该将测试分成适当的单元测试,并测试较小的代码单元。使用Django并仅测试视图代码。或者将视图拆分为更小的函数并单独测试它们


使用Django的测试客户端更像是一个集成测试而不是单元测试,因为它测试url路由、数据库、中间件、模板等。。。可能允许人们建议如何更好地进行单元测试。其次,就我个人而言,我发现如果我要返回200,我很少专门检查status_code==20,而是执行self.assertContains(响应,“我正在寻找的一些文本”),它隐式地也执行200检查。YMMV。@Foon我添加了测试的相关片段。