Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 自定义HttpHandler上的单元测试_Python 3.x_Python Unittest_Python Mock - Fatal编程技术网

Python 3.x 自定义HttpHandler上的单元测试

Python 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

我编写了一个自定义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.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)
等。通常,我会在
设置中移动服务器,并在
拆卸中停止服务器线程。当然,这不再是一个纯粹的单元测试,更像是一个系统测试,但它做得很好。对于纯粹的单元测试,您可能会发现这个问题的答案很有用:谢谢您的帮助。在单独的线程中启动服务器是我的第一个想法,但我也认为这不是一个纯粹的单元测试。我最初发布的代码是从您提到的问题中得到启发的,但是没有办法得到响应。我想我会选择这两个选项来涵盖一切。