[英]Why does python mock.patch work differently when second patch argument is used vs 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()
接受任意关键字参数。 这些将被传递到AsyncMock
如果修补的物体是异步的,以MagicMock
否则或new_callable
如果指定。
从mock.patch.object的文档:
与
patch()
一样,patch.object()
任意关键字参数来配置它创建的模拟对象。
return_value
:调用模拟时返回的值。 默认情况下,这是一个新的 Mock(在第一次访问时创建)。 请参阅return_value
属性。
为了更好地衡量, return_value
属性的文档,其中显示了示例的用法:
设置此项以配置通过调用模拟返回的值:
>>> mock = Mock()
>>> mock.return_value = 'fish'
>>> mock()
'fish'
默认返回值是一个模拟对象,您可以按正常方式配置它:
>>> 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
因此,正如您所看到的,这一切都有据可查,尽管不可否认,由于签名中不存在参数,乍一看可能会忽略它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.