如何在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
相关产品推荐
相关产品推荐

