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

unittest.mock.patch未收录入文档的return_value参数工作原理是什么?

关于unittest.mock.patch 系列方法return_value参数的答疑
  • 首先可以明确:return_value是官方完全支持的合法用法,不属于未定义行为。
  • 该参数不属于「应公开未录入文档」的遗漏参数,原因是patch、patch.object的参数设计本身就支持透传额外关键字参数给底层创建的Mock实例,return_value是unittest.mock.Mock类本身的公开合法参数,因此不需要在patch的参数列表中重复定义。
  • 示例可正常运行绝非巧合,是框架原生设计的便捷语法。
  • 该参数的实际作用就是直接指定被mock的目标对象被调用时的返回值,等价于拿到mock实例后手动赋值mock_method.return_value = None。

你给出的示例代码:

with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
    thing = ProductionClass()
    thing.method(1, 2, 3)

完全等价于写法:

with patch.object(ProductionClass, 'method') as mock_method:
    mock_method.return_value = None
    thing = ProductionClass()
    thing.method(1, 2, 3)

两种写法效果完全一致,前者只是更简洁的语法糖。

可能不符合直觉的边界行为

  • 如果你给patch传了new或者new_callable参数指定了非默认的替换对象,那么你传入的return_value参数会失效,因为此时创建的替换对象不是默认的Mock类实例,不会接收这些参数。
  • 如果mock的目标是类而不是类方法,那么return_value指定的是该类被实例化(即调用类名())时的返回值,而非类方法的返回值,这点很容易和方法级别的mock混淆。
  • 如果后续你手动修改了mock实例的return_value属性,会覆盖你在patch调用时传入的参数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:04