Python 3.x 自定义HttpHandler上的单元测试
我编写了一个自定义HTTPPython 3.x 自定义HttpHandler上的单元测试,python-3.x,python-unittest,python-mock,Python 3.x,Python Unittest,Python Mock,我编写了一个自定义HTTP处理程序类来处理发送到本地服务器的GET请求。我想测试do\u GET方法的内部功能。到目前为止,这是我想到的。这仅测试是否调用了do_GET方法,仅此而已 Class TestHandler(unittest.Testcase): def setUp(self): self.mock_request = Mock() @patch('http.server.HTTPServer') @patch('my_module.Han
处理程序
类来处理发送到本地服务器的GET
请求。我想测试do\u GET
方法的内部功能。到目前为止,这是我想到的。这仅测试是否调用了do_GET
方法,仅此而已
Class TestHandler(unittest.Testcase):
def setUp(self):
self.mock_request = Mock()
@patch('http.server.HTTPServer')
@patch('my_module.Handler.do_GET')
def test_do_get(self, mock_do_get, mock_http_server):
"""Test if do_GET method gets called"""
mock_do_get.return_value = "/"
self.mock_request.makefile.return_value = IO(b"GET /")
server = Handler(self.mock_request, ('127.0.0.1', 8080), mock_http_server)
self.assertTrue(mock_do_get.called)
self.assertEqual(server.do_GET(), "/")
更新版本现在我知道了一个事实,即在发送
GET
请求时调用了do\u GET
方法GET,但我无法检查http响应
@patch('http.server.HTTPServer')
def test_do_get_monkey(self, mock_http_server):
self.mock_request.makefile.return_value = IO(b"GET /test")
handler = HttpHandler(self.mock_request, ('127.0.0.1', 8080), mock_http_server)
handler.do_GET = MagicMock(return_value="/")
handler.do_GET()
handler.do_GET.assert_called_with()
我想测试该方法的内部功能——这是一个没有上下文的过于广泛的愿望。您始终可以修补在
do_GET
中调用的函数,并在处理HTTP请求后,断言它们是否使用正确的参数调用,但除此之外,如果不查看代码,就无法回答问题。@hoefling我考虑了您的评论。请看一下我问题的最新版本。我所说的测试方法内部功能的意思是,我有几个端点,我的服务器对这些端点做出不同的反应,因此我想知道当某个端点被击中时,服务器是否给出了正确的响应。通常,如果我需要测试服务器的响应,我在一个单独的线程中启动服务器,并通过请求
,例如server=HTTPServer('127.0.0.1',8000),Handler请求相关URL;runner=threading.Thread(target=server.serve\u);runner.start();睡眠时间(3);response=requests.get('http://127.0.0.1:8000/somepath'); self.assertEqual(response.status_code,200)
等。通常,我会在设置中移动服务器,并在拆卸中停止服务器线程。当然,这不再是一个纯粹的单元测试,更像是一个系统测试,但它做得很好。对于纯粹的单元测试,您可能会发现这个问题的答案很有用:谢谢您的帮助。在单独的线程中启动服务器是我的第一个想法,但我也认为这不是一个纯粹的单元测试。我最初发布的代码是从您提到的问题中得到启发的,但是没有办法得到响应。我想我会选择这两个选项来涵盖一切。