如何在Python中为嵌套调用构建MagicMock?
正确模拟嵌套调用的MagicMock实现方案
针对你的业务代码中嵌套的boto3调用链,需要逐层构建Mock对象来覆盖整个调用流程,以下是修正后的测试代码及说明:
完整测试代码
from unittest.mock import MagicMock import unittest import boto3 import info # 导入你的业务代码模块 class ReportTests(unittest.TestCase): def test_kms_aliases(self): # arrange ids_include = ["string1", "string2"] # 预设要返回的KMS别名数据 kms_aliases = {"Aliases": [{"AliasName": "alias/test1"}, {"AliasName": "alias/test2"}]} expected = kms_aliases # 构建最内层Mock:模拟response_iterator的build_full_result方法 mock_response_iterator = MagicMock() mock_response_iterator.build_full_result.return_value = kms_aliases # 构建paginator的Mock:让paginate方法返回上面的response_iterator mock_paginator = MagicMock() mock_paginator.paginate.return_value = mock_response_iterator # 构建KMS客户端的Mock:让get_paginator方法返回上面的paginator mock_client = MagicMock() mock_client.get_paginator.return_value = mock_paginator # 让boto3.client('kms')返回我们构建的客户端Mock boto3.client = MagicMock(return_value=mock_client) # act actual = info.kms_aliases(ids_include) # assert self.assertEqual(expected, actual)
关键步骤说明
- 逐层Mock调用链:按照业务代码的调用顺序从内到外构建Mock对象,确保每一步的返回值都指向对应的Mock实例:
mock_response_iterator:模拟分页迭代器,指定build_full_result()的返回值为预设数据mock_paginator:模拟分页器,让paginate()返回上述迭代器Mockmock_client:模拟KMS客户端,让get_paginator('list_aliases')返回上述分页器Mock- 最后让
boto3.client返回这个客户端Mock,确保业务代码中boto3.client('kms')能拿到我们的Mock实例
- 规范断言方式:在
unittest.TestCase中建议使用self.assertEqual替代直接assert,更符合单元测试框架的输出规范。
内容的提问来源于stack exchange,提问作者Banoona
相关产品推荐
相关产品推荐

