gpt4 book ai didi

python - Django 测试 : See traceback where wrong Response gets created

转载 作者:行者123 更新时间:2023-11-28 22:41:10 25 4
gpt4 key购买 nike

此模式来自 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 网络客户端的子类):Django: assertEqual(response.status_code, 200): I want to see useful stack of functions calls

最佳答案

我认为这可以通过创建一个 TestCase 子类来实现,该子类猴子修补 django.http.response.HttpResponseBase.__init__() 以记录堆栈跟踪并将其存储在Response 对象,然后编写一个 assertResponseCodeEquals(response, status_code=200) 方法,在失败时打印存储的堆栈跟踪以显示 Response已创建。

我实际上可以自己使用一个解决方案,并且可能会考虑实现它。

更新:这是一个 v1 实现,它可以使用一些改进(例如,只打印堆栈跟踪的相关行)。

import mock
from traceback import extract_stack, format_list
from django.test.testcases import TestCase
from django.http.response import HttpResponseBase

orig_response_init = HttpResponseBase.__init__

def new_response_init(self, *args, **kwargs):
orig_response_init(self, *args, **kwargs)
self._init_stack = extract_stack()

class ResponseTracebackTestCase(TestCase):
@classmethod
def setUpClass(cls):
cls.patcher = mock.patch.object(HttpResponseBase, '__init__', new_response_init)
cls.patcher.start()

@classmethod
def tearDownClass(cls):
cls.patcher.stop()

def assertResponseCodeEquals(self, response, status_code=200):
self.assertEqual(response.status_code, status_code,
"Response code was '%s', expected '%s'" % (
response.status_code, status_code,
) + '\n' + ''.join(format_list(response._init_stack))
)

class MyTestCase(ResponseTracebackTestCase):
def test_index_page_returns_200(self):
response = self.client.get('/')
self.assertResponseCodeEquals(response, 200)

关于python - Django 测试 : See traceback where wrong Response gets created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com