從其他的答案來看,任何人,除非@rob-kennedy談到call_args_list
。
它是可以實現的MagicMock.assert_called_with()
call_args_list
變成完全相反的一個強大的工具call
對象的列表。每個call
對象表示在模擬的可調用對象上進行的調用。
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m.call_args_list
[]
>>> m(42)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42)]
>>> m(42, 30)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42), call(42, 30)]
消耗call
目的是容易的,因爲可以用長度爲2,其中第一組分是含有相關呼叫的所有的位置參數的元組的元組進行比較,而第二個部件是一個字典關鍵字參數。
>>> ((42,),) in m.call_args_list
True
>>> m(42, foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((42,), {'foo': 'bar'}) in m.call_args_list
True
>>> m(foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((), {'foo': 'bar'}) in m.call_args_list
True
所以,這是一種解決OP的具體問題是
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
需要注意的是這種方式,而不是隻檢查是否嘲笑調用被調用,通過MagicMock.called
,你現在可以檢查它是否被一組特定的參數調用。
這很有用。假設你想測試一個帶有列表的函數,並且只有在列表中的每個值滿足特定條件時才調用另一個函數compute()
。
您現在可以模擬compute
,並測試它是否被調用了某個值,但不是其他值。
由於@Ahmet在他的回答中指出,現在assert_not_called支持,也是在反向移植(https://docs.python.org/3/library/unittest.mock.html#unittest.mock .Mock.assert_not_called)。 – Martin