Судячи з інших відповідей, ніхто, окрім @ 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
Отже, спосіб вирішити конкретну проблему ОП - це
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Зауважте, що таким чином, замість того, щоб просто перевірити, чи був викликаний глузливий дзвінок, через MagicMock.called, тепер ви можете перевірити, чи він викликався за допомогою певного набору аргументів.
Це корисно. Скажімо, ви хочете перевірити функцію, яка приймає список і викликати іншу функцію compute(), для кожного зі значень списку, лише якщо вони відповідають певній умові.
Тепер ви можете знущатись computeі перевіряти, чи було виклик якогось значення, а не іншого.