如何简化测试中多层嵌套的Mock方法调用?
简化嵌套Mock调用的优雅写法
当然有更简洁的办法!你现在的代码重复创建Mock对象确实有点繁琐,正如Raymond Hettinger所说——“一定有更好的办法!”,而unittest.mock库本身就提供了链式设置return_value的能力,能帮你把冗余的代码大幅简化:
# 简化后的代码 my_obj.child_object = mock.Mock() my_obj.child_object.meth1_call.return_value.meth2_call.return_value = custom_list
为什么这能行?
这里的核心逻辑是利用Mock对象的return_value属性:
- 当你调用
my_obj.child_object.meth1_call()时,实际上返回的就是my_obj.child_object.meth1_call.return_value这个Mock实例 - 我们直接给这个返回对象的
meth2_call.return_value赋值为custom_list,就等价于你之前手动层层创建Mock并赋值的逻辑,但写法简洁太多。
如果你的child_object是通过类属性(比如@property装饰的)而非直接赋值的方式访问,那你可能需要用mock.PropertyMock来配合,但从你的代码场景来看,直接用上面的链式写法就完全满足需求了。
内容的提问来源于stack exchange,提问作者Jürgen Gmach
相关产品推荐
相关产品推荐

