Nach anderen Antworten zu urteilen, sprach niemand außer @ rob-kennedy über das call_args_list
.
Es ist ein mächtiges Werkzeug, mit dem Sie genau das Gegenteil von implementieren können MagicMock.assert_called_with()
call_args_list
ist eine Liste von call
Objekten. Jedes call
Objekt repräsentiert einen Aufruf eines verspotteten Callable.
>>> 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)]
Das Konsumieren eines call
Objekts ist einfach, da Sie es mit einem Tupel der Länge 2 vergleichen können, wobei die erste Komponente ein Tupel ist, das alle Positionsargumente des zugehörigen Aufrufs enthält, während die zweite Komponente ein Wörterbuch der Schlüsselwortargumente ist.
>>> ((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
Ein Weg, um das spezifische Problem des OP anzugehen, ist also
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Beachten Sie, dass Sie auf diese Weise, anstatt nur zu überprüfen, ob ein verspotteter Callable aufgerufen wurde, über MagicMock.called
überprüfen können, ob er mit einem bestimmten Satz von Argumenten aufgerufen wurde.
Das ist nützlich. Angenommen, Sie möchten eine Funktion testen, die eine Liste erstellt, und eine andere Funktion aufrufen.compute()
, für jeden Wert der Liste nur dann wenn sie eine bestimmte Bedingung erfüllen.
Sie können jetzt verspotten compute
und testen, ob ein Wert aufgerufen wurde, andere jedoch nicht.