如何让待测代码使用测试中创建的Google Python API HttpMock对象
问题原因
你当前写法的核心问题是:@patch替换掉被测文件里的build方法后,你手动调用mock_build生成的service并没有配置为被测代码调用build时的返回值,被测代码里拿到的是Mock框架自动生成的通用Mock对象,和你创建的HttpMock实例完全没有关联,自然不会用到你预设的HTTP响应。
修复方案
你不需要手动模拟service的链式调用(events().insert().execute()),只需要把绑定了HttpMock的真实service实例设置为被patch的build方法的返回值即可,步骤如下:
- 先创建
HttpMock实例,指定响应文件和预期状态码 - 调用原生的
build方法,传入上面创建的HttpMock实例作为http参数,生成绑定了mock HTTP逻辑的service对象 - 将这个service对象设置为
mock_build.return_value,这样被测代码调用build时,不管传入什么credentials参数,都会拿到这个已经配置好mock响应的service - 正常执行被测函数即可,调用
.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
相关产品推荐
相关产品推荐

