[英]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.