pytest单元测试中如何mock第三方库API的返回响应
pytest mock第三方HubSpot API响应的实现方法
直接用pytest内置支持的unittest.mock模块拦截SDK调用逻辑就行,完全不会发起真实网络请求,也不需要实际对接HubSpot服务。
你贴的源码有个语法小问题:
from hubspot. import ApiException末尾多了个点,正确写法是from hubspot import ApiException,不改的话代码跑不起来。
测试覆盖场景
- 接口正常返回数据的成功分支
- 接口抛出
ApiException的异常分支
完整测试代码示例
把下面代码里的your_module替换成你存放get_clicked_events函数的实际模块路径即可:
from unittest.mock import patch, MagicMock import pytest # 导入被测函数和SDK异常类 from your_module import get_clicked_events from hubspot import ApiException def test_get_clicked_events_success(): # 按业务需要构造模拟返回值即可 mock_response = { "results": [{"id": 1, "event_type": "clicked", "properties": {}}], "paging": None } # patch路径必须和被测文件里的hubspot导入路径完全对齐,不然mock不生效 with patch("your_module.hubspot.Client.create") as mock_client_create: mock_client = MagicMock() # 给接口调用方法设置固定返回值 mock_client.events_api.get_page.return_value = mock_response mock_client_create.return_value = mock_client result = get_clicked_events() # 断言返回结果符合预期 assert result == mock_response # 断言调用参数正确,避免后续改传参时漏测 mock_client.events_api.get_page.assert_called_once_with(limit=100, event_type="clicked") def test_get_clicked_events_api_exception(capsys): # 用pytest自带的capsys捕获print输出,校验异常分支逻辑 mock_exception = ApiException(status=403, reason="Invalid API key") with patch("your_module.hubspot.Client.create") as mock_client_create: mock_client = MagicMock() # 设置side_effect让方法调用时直接抛出异常 mock_client.events_api.get_page.side_effect = mock_exception mock_client_create.return_value = mock_client result = get_clicked_events() # 原代码异常分支只打印日志没有返回值,所以结果为None assert result is None # 校验错误日志正常输出 captured_log = capsys.readouterr() assert "Exception when calling events_api->get_page" in captured_log.out
注意事项
- patch路径不要写错:必须写被测文件内的hubspot引用路径,比如你的函数存放在
src/util/hs_util.py里,patch路径就写src.util.hs_util.hubspot.Client.create,不要直接patch全局的hubspot.Client.create,会出现mock不生效的问题。 - 不要mock过深:不用去拦截SDK底层的requests请求,就mock你代码里直接调用的SDK公开方法即可,后续SDK小版本升级也不会导致测试失效,稳定性更高。
- 这种mock方式完全跳过了客户端初始化逻辑,就算你后续把API key改成从环境变量读取,也不需要调整测试代码,不会校验真实密钥合法性。
内容的提问来源于stack exchange,提问作者fizzbuzzzzz
相关产品推荐
相关产品推荐

