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

如何让待测代码使用测试中创建的Google Python API HttpMock对象

问题原因

你当前写法的核心问题是:@patch替换掉被测文件里的build方法后,你手动调用mock_build生成的service并没有配置为被测代码调用build时的返回值,被测代码里拿到的是Mock框架自动生成的通用Mock对象,和你创建的HttpMock实例完全没有关联,自然不会用到你预设的HTTP响应。

修复方案

你不需要手动模拟service的链式调用(events().insert().execute()),只需要把绑定了HttpMock的真实service实例设置为被patch的build方法的返回值即可,步骤如下:

  1. 先创建HttpMock实例,指定响应文件和预期状态码
  2. 调用原生的build方法,传入上面创建的HttpMock实例作为http参数,生成绑定了mock HTTP逻辑的service对象
  3. 将这个service对象设置为mock_build.return_value,这样被测代码调用build时,不管传入什么credentials参数,都会拿到这个已经配置好mock响应的service
  4. 正常执行被测函数即可,调用.execute()时会自动走你配置的HttpMock返回预设响应
正确的测试代码示例
#test_add_entry_to_calendar.py
from googleapiclient.http import HttpMock
from googleapiclient.discovery import build
from unittest.mock import patch
# 导入被测模块
import add_entry_to_calendar

class TestCalendarEntry:
    @patch("add_entry_to_calendar.build")
    def test_add_entry_to_calendar_400(self, mock_build):
        # 初始化预设400响应的HttpMock
        http_mock = HttpMock('tests/config-test.json', {'status': '400'})
        # 构造绑定了HttpMock的Calendar服务实例
        mocked_calendar_service = build("calendar", "v3", http=http_mock)
        # 配置被测代码调用build时返回我们构造好的mock服务
        mock_build.return_value = mocked_calendar_service

        # 执行被测逻辑
        result = add_entry_to_calendar.add_entry_to_calendar({"A": "B"})
        self.assertEqual(result, None)
注意事项
  • 确保tests/config-test.json路径是测试执行时工作目录下的正确相对路径,避免HttpMock读文件失败
  • config-test.json里的内容需要符合Google Calendar API对应接口的响应格式,400错误场景可以直接存对应格式的错误响应JSON,避免JSON解析报错
  • 这种写法不需要你手动mock链式调用的各个方法返回值,完全模拟真实API的HTTP调用流程,测试结果更贴近实际运行情况

内容的提问来源于stack exchange,提问作者Dennis_M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:54:40