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

如何在Python Pytest中用MagicMock模拟类方法内的嵌套函数?

如何模拟嵌套在func_a内部的func_b?

你之前用patch('x.func_a.func_b')无效的核心原因是:func_b是func_a的内部嵌套函数,它的作用域完全被限制在func_a内部,外部代码(包括测试代码)根本无法直接引用到这个函数对象,所以patch找不到目标。

下面是两种可行的解决思路:

方案1:重构代码(最推荐)

把嵌套的func_b提取成独立的类方法或者模块级函数,这样就能直接通过patch模拟它。修改原代码如下:

class X:
    def func_a(self, a):
        # 原有逻辑
        self.func_b(a)
    
    def func_b(self, b):
        # 原有func_b的逻辑

测试时就可以直接模拟X.func_b:

with patch('your_module.X.func_b', side_effect=mock_func_b):
    # 执行你的测试逻辑

方案2:不重构的折中方案(仅作参考)

如果实在不想改动原代码,你只能通过验证func_b执行后的副作用来间接测试,或者模拟func_b内部调用的外部依赖。比如:

  • 如果func_b会操作某个全局变量、数据库或者文件,你可以在测试中检查这些对象的状态变化;
  • 如果func_b调用了其他外部函数/API,你可以直接patch那个外部依赖,以此间接确认func_b是否按预期执行。

比如假设func_b内部调用了requests.get,你可以这样测试:

with patch('requests.get') as mock_get:
    # 调用X().func_a(a)
    mock_get.assert_called_once_with(预期参数)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:33:32