example Python模擬補丁參數`new` vs`new_callable`



plot python用法 (2)

從文檔http://www.voidspace.org.uk/python/mock/patch.html

patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)

如果新的被省略,那麼目標被替換為MagicMock。 如果patch用作裝飾器,並且省略new,則創建的模擬作為額外參數傳入裝飾函數。 如果將補丁用作上下文管理器,則創建的模擬將由上下文管理器返回。

new_callable允許你指定一個不同的類或可調用的對象,這個對象將被調用來創建新的對象。 默認使用MagicMock。

我試圖了解兩者之間的差異,以及使用new_callable而不是new

https://ffff65535.com


new是一個實際的對象; new_callable是一個用於創建對象的可調用對象。 這兩個不能一起使用(您可以指定替換或一個函數來創建替換;這是一個錯誤,使用兩者)。

>>> foo = 6
>>> with mock.patch('__main__.foo', new=7):
...   print foo
...
7
>>> with mock.patch('__main__.foo', new_callable=lambda : 8):
...   print foo
...
8

newmock.DEFAULT ,模擬對MagicMock一個MagicMock實例,正是因為MagicMock的默認值是MagicMock


[編輯]在這個答案中,我錯過了最重要的事情, new一個對象和new_callable可調用(工廠)正如@chepner所說的。 我不刪除它,因為它包含一些有用的筆記。

通過挖掘代碼https://code.google.com/p/mock/source/browse/mock.py#1266清楚地表明, new你不能通過名義參數設置屬性,並使用specspec_set因為它會引發TypeError異常。

new_callable可以是NonCallableMock本身的一個子類,你可以在補丁定義中使用所有的模擬工具。

確定這種行為確實沒有記錄,並且在http://www.voidspace.org.uk/python/mock/changelog.html#version-0-8-0中找不到更多。

補丁和patch.object的新new_callable參數允許您傳入一個類或可調用的對象(而不是MagicMock),將被調用來替換正在打補丁的對象

無論如何,你不能用這樣的東西來創建一個YourMockSubclassmyobject簽名

@patch("mymodule.myobject", new=YourMockSubclass(), spec=myobject)

但在這種情況下,你必須使用new_callable

@patch("mymodule.myobject", new_callable=YourMockSubclass, spec=myobject)

所以每次你需要一個非MagicMock模擬new_callable時,你必須使用new_callable

恕我直言,唯一有用的用途是嘲弄財產。





mocking