Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 转换烧瓶。响应请求。响应_Python_Unit Testing_Flask_Mocking_Python Requests - Fatal编程技术网

Python 转换烧瓶。响应请求。响应

Python 转换烧瓶。响应请求。响应,python,unit-testing,flask,mocking,python-requests,Python,Unit Testing,Flask,Mocking,Python Requests,我正在编写一些测试,我想将flask.Response对象转换为相应的requests.Response对象。因此,我有两个Flask应用程序(例如A和B),并且A对B进行内部调用(通过请求.post(url,json=payload))。我的目标是在不启动任何服务器的情况下正确模拟这些调用,当前的解决方案如下所示: from unittest import mock ... def mock_B_request(url, json): response = app_B.test_c

我正在编写一些测试,我想将flask.Response对象转换为相应的requests.Response对象。因此,我有两个Flask应用程序(例如
A
B
),并且
A
B
进行内部调用(通过
请求.post(url,json=payload)
)。我的目标是在不启动任何服务器的情况下正确模拟这些调用,当前的解决方案如下所示:

from unittest import mock

...

def mock_B_request(url, json):
    response = app_B.test_client().post(url, json=json)  # flask.Response
    # Some hacking should be done here, 
    # since flask.Respone doesn't have `.ok`, `.json()`, etc.,
    # so it will break the code inside app_A
    return response

...

# Inside the actual test method
with mock.patch('requests.post', side_effect=mock_B_request):
    response = app_A.test_client().post(url, json=payload)
    result = response.get_json()
...

有没有人遇到过这样的问题?这里最简单的解决方案是什么?

最终,我找到了一个非常简单的解决方案:

def mock_B_request(url, **kwargs):
   response = app_B.test_client().post(url, json=kwargs['json'])

   # Hack a bit in order to make flask.Response
   # support the same API as requests.Response
   response_mock = mock.MagicMock()
   response.status_code = response.status_code
   response_mock.ok = response.status_code == 200
   response_mock.json = lambda: response.get_json()
   return response_mock
我希望这对某人有帮助