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

如何在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实例:
    1. mock_response_iterator:模拟分页迭代器,指定build_full_result()的返回值为预设数据
    2. mock_paginator:模拟分页器,让paginate()返回上述迭代器Mock
    3. mock_client:模拟KMS客户端,让get_paginator('list_aliases')返回上述分页器Mock
    4. 最后让boto3.client返回这个客户端Mock,确保业务代码中boto3.client('kms')能拿到我们的Mock实例
  • 规范断言方式:在unittest.TestCase中建议使用self.assertEqual替代直接assert,更符合单元测试框架的输出规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:49