我正在编写一些测试,我想将flask.Response对象转换为相应的request.Response对象。因此,我有2个Flask应用程序(例如A
和B
),而A
通过B
对requests.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()
...
有人已经遇到这样的问题吗?什么是最简单的解决方案?
答案 0 :(得分:0)
最终,我找到了一个非常简单的解决方案:
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
我希望这对某人有帮助。