模拟api响应

时间:2020-08-17 01:29:01

标签: python pytest

背景

我有一个名为Submit_health的函数,该函数负责对我们传递的某些数据进行POST请求。预期的输出始终采用以下格式:

{
    "errors": [],
    "warnings": [],
    "success": true
} 

唯一的区别是,在某些情况下,如果我们发送无效的数据,则"success": false是可能的,当然,“错误”和“警告”将有适当的文字说明为什么没有成功的发帖请求。

代码

   def submit_health(health_data):
        return _post_json("health-single", health_data)


def _post_json(resource: str, data: Dict) -> PostResponse:
    json_data = json.dumps(data, default=json_encoding_decimal_default)
    response = request_session_with_retry().post(
        f"{SITE_API_ROOT}/v3/{resource}",
        auth=("", SITE_API_V3_KEY),
        data=json_data,
        headers={"Content-Type": "application/json", "User-Agent": USER_AGENT},
    )
    response.raise_for_status()
    try:
        return json.loads(response.text)
    except Exception:
        return None

问题

我正在尝试使用pytest测试submit_health函数。我不关心API的实现,因为代码的不同部分正在处理该测试。我只关心用预期的输出进行测试

{
    "errors": [],
    "warnings": [],
    "success": true
} 

我的问题是我该如何嘲笑此回复?我很乐意提供任何建议。我读了一些有关猴子修补的内容,但我还不确定如何模拟响应。我希望获得一些指导。

1 个答案:

答案 0 :(得分:2)

假设您的函数位于health.py模块中,我将使用代码创建一个test_health.py模块:

from unittest.mock import Mock, patch

from health import submit_health


@patch("health.request_session_with_retry")
def test_submit_health(request_mock):
    response_mock = Mock(text='{"errors": [], "warnings": [], "success": true}')
    request_mock.return_value.get.return_value = response_mock

    result = submit_health({"foo": "bar"})

    assert result == {"errors": [], "warnings": [], "success": True}
  1. @patch将修补的函数作为参数传递给我,命名为request_mock
  2. 我们需要确定request_session_with_retry.get被调用时该模拟返回的内容