You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:12:18