Sądząc po innych odpowiedziach, nikt oprócz @ rob-kennedy nie mówił o call_args_list
.
To potężne narzędzie, dzięki któremu możesz wdrożyć dokładnie odwrotnie niż MagicMock.assert_called_with()
call_args_list
to lista call
obiektów. Każdy call
obiekt reprezentuje wywołanie wykonane na fałszywym wywołaniu.
>>> 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)]
Korzystanie z call
obiektu jest łatwe, ponieważ można go porównać z krotką o długości 2, w której pierwszy składnik jest krotką zawierającą wszystkie argumenty pozycyjne powiązanego wywołania, podczas gdy drugi składnik jest słownikiem słów kluczowych arguments.
>>> ((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
Tak więc sposobem rozwiązania konkretnego problemu PO jest
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Zauważ, że w ten sposób, zamiast po prostu sprawdzać, czy wywołano fałszywe wywołanie, MagicMock.called
możesz teraz sprawdzić, czy zostało wywołane z określonym zestawem argumentów.
To przydatne. Powiedzmy, że chcesz przetestować funkcję, która pobiera listę i wywołuje inną funkcję compute()
, dla każdej wartości listy tylko wtedy, gdy spełniają określony warunek.
Możesz teraz kpić compute
i sprawdzić, czy została wywołana na jakiejś wartości, ale nie na innych.