【问题标题】:Convert flask.Response to requests.Response将 flask.Response 转换为 requests.Response
【发布时间】:2018-08-05 09:16:00
【问题描述】:

我正在编写一些测试,我想将 flask.Response 对象转换为相应的 requests.Response 对象。所以我有 2 个 Flask 应用程序(例如 AB),并且 AB 进行内部调用(通过 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()
...

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

【问题讨论】:

    标签: python unit-testing flask mocking python-requests


    【解决方案1】:

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

    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
    

    我希望它对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2014-07-20
      • 2017-01-27
      • 2013-05-10
      相关资源
      最近更新 更多