Ich verwende die Mock-Bibliothek, um meine Anwendung zu testen, möchte jedoch behaupten, dass eine Funktion nicht aufgerufen wurde. Mock-Dokumente sprechen über Methoden wie mock.assert_called_with
und mock.assert_called_once_with
, aber ich habe nichts Ähnliches mock.assert_not_called
oder ähnliches gefunden, um zu überprüfen, ob Mock NICHT aufgerufen wurde .
Ich könnte mit so etwas wie dem folgenden gehen, obwohl es weder cool noch pythonisch erscheint:
def test_something:
# some actions
with patch('something') as my_var:
try:
# args are not important. func should never be called in this test
my_var.assert_called_with(some, args)
except AssertionError:
pass # this error being raised means it's ok
# other stuff
Irgendwelche Ideen, wie man das erreicht?
python
unit-testing
mocking
python-mock
Gerard
quelle
quelle
Antworten:
Dies sollte für Ihren Fall funktionieren.
Stichprobe;
quelle
AttributeError: MockCallable instance has no attribute 'called'
sudo easy_install -U mock
undfrom mock import Mock
unter MacOS läuft das oben genannte reibungslos. Nie Django installiert :)from mock import Mock
Python Mock 0.1.0 für meine Tests. Klingt irgendetwas davon problematisch?module_to_test.another_module.class = mock.Mock()
Sie also bestätigen , dass Sie sich nicht an Aufrufe in verschiedenen Testfällen (unittest.TestCase-Instanzen) erinnern können? Ich denke, die Anzahl derObwohl es sich um eine alte Frage handelt, möchte ich hinzufügen, dass die aktuelle
mock
Bibliothek (Backport von unittest.mock) dieassert_not_called
Methode unterstützt .Aktualisieren Sie einfach Ihre;
pip install mock --upgrade
quelle
Sie können das
called
Attribut überprüfen. Wenn Ihre Behauptung jedoch fehlschlägt, sollten Sie als Nächstes etwas über den unerwarteten Anruf wissen. Sie können also auch veranlassen, dass diese Informationen von Anfang an angezeigt werden. Mitunittest
können Siecall_args_list
stattdessen den Inhalt überprüfen von :Wenn es fehlschlägt, wird folgende Meldung angezeigt:
quelle
Wenn Sie mit class testen, erbt unittest.TestCase einfach Methoden wie:
und ähnliches (in der Python-Dokumentation finden Sie den Rest).
In Ihrem Beispiel können wir einfach behaupten, ob die Eigenschaft mock_method.called False ist , was bedeutet, dass die Methode nicht aufgerufen wurde.
quelle
Mit können
python >= 3.5
Sie verwendenmock_object.assert_not_called()
.quelle
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 voncall
Objekten. Jedescall
Objekt repräsentiert einen Aufruf eines verspotteten Callable.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.Ein Weg, um das spezifische Problem des OP anzugehen, ist also
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.quelle