unittest.mock.patch 的(未记录的)return_value 参数如何工作?

How does the (undocumented) return_value argument for unittest.mock.patch work?

我看过 unittest.mock.patch()unittest.mock.patch.object() 直接使用 return_value 参数的例子。

示例:

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

但是,此论点并未正式记录在 unittest.mock.patch()unittest.mock.patch.object() 中。 (但是在官方文档的示例中使用了它)。

这是受支持的还是未定义的行为?它应该被记录下来,但不是吗?这些例子是巧合吗?这个论点有什么作用;它做了一些不直观的事情,还是不言自明的?

来自 mock.patch 的文档:

patch() takes arbitrary keyword arguments. These will be passed to AsyncMock if the patched object is asynchronous, to MagicMock otherwise or to new_callable if specified.

来自 mock.patch.object 的文档:

Like patch(), patch.object() takes arbitrary keyword arguments for configuring the mock object it creates.

并且从mock.Mock的文档中,实际使用的地方:

return_value: The value returned when the mock is called. By default this is a new Mock (created on first access). See the return_value attribute.

为了更好地衡量,return_value 属性的文档显示了示例的用法:

设置它以配置值 return 通过调用 mock:

>>> mock = Mock()
>>> mock.return_value = 'fish'
>>> mock()
'fish'

默认的return值是一个模拟对象,你可以用正常的方式配置它:

>>> mock = Mock()
>>> mock.return_value.attribute = sentinel.Attribute
>>> mock.return_value()
<Mock name='mock()()' id='...'>
>>> mock.return_value.assert_called_with()

return_value也可以在构造函数中设置:

>>> mock = Mock(return_value=3)
>>> mock.return_value
3
>>> mock()
3

所以,如您所见,这一切都有详细的记录,但不可否认,由于签名中没有参数,乍一看可能会被忽略。