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

