Судячи з інших відповідей, ніхто, окрім @ 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
і перевіряти, чи було виклик якогось значення, а не іншого.