assert_called¶
Bisher haben wir die Rückgabewerte einer Mocking-Methode verwendet, um
sicherzustellen, dass unser Anwendungscode mit den Rückgabewerten richtig
umgeht. Aber manchmal gibt es keinen nützlichen Rückgabewert, z. B. bei tasks add some tasks -o veit. In diesen Fällen
können wir das Mock-Objekt mit assert_called_with() fragen, ob es korrekt
aufgerufen wurde. Nach dem Aufruf von tasks_cli("add some tasks -o
veit")() wird nicht die API verwendet, um zu prüfen, ob das Element in die
Datenbank gelangt ist, sondern ein Mock, um sicherzustellen, dass die CLI die
richtige API-Methode korrekt aufgerufen hat. Die Implementierung des Befehls
add() ruft schließlich db.add_task() mit einem Task-Objekt auf:
def test_add_with_owner(mock_tasksdb, tasks_cli):
tasks_cli("add some task -o veit")
expected = tasks.Task("some task", owner="veit", state="todo")
mock_tasksdb.add_task.assert_called_with(expected)
Wenn add_task() nicht aufgerufen wird oder mit dem falschen Typ oder dem
falschen Objektinhalt aufgerufen wird, schlägt der Test fehl. Wenn wir
z.B. in expected den String "Veit" groß
schreiben, aber nicht im CLI-Aufruf, erhalten wir folgende Ausgabe:
$ uv run pytest -s tests/cli/test_add.py::test_add_with_owner
============================= test session starts ==============================
...
configfile: pyproject.toml
plugins: cov-4.1.0, Faker-19.11.0
collected 1 item
tests/cli/test_add.py F
...
> raise AssertionError(_error_message()) from cause
E AssertionError: expected call not found.
E Expected: add_task(Task(summary='some task', owner='Veit', state='todo', id=None))
E Actual: add_task(Task(summary='some task', owner='veit', state='todo', id=None))
...
=========================== short test summary info ============================
FAILED tests/cli/test_add.py::test_add_with_owner - AssertionError: expected call not found.
============================== 1 failed in 0.08s ===============================
Siehe auch
Es gibt eine ganze Reihe von Varianten von assert_called(). Eine
vollständige Liste und Beschreibung erhaltet ihr in
unittest.mock.Mock.assert_called().
Wenn die einzige Möglichkeit zum Testen darin besteht, den korrekten Aufruf
sicherzustellen, erfüllen die verschiedenen assert_called*()-Methoden
ihren Zweck.