autospec¶
Mock-Objekte sind in der Regel als Objekte gedacht, die anstelle der echten
Implementierung verwendet werden. Standardmäßig werden sie jedoch jeden Zugriff
akzeptieren. Wenn das echte Objekt beispielsweise start(index)() zulässt,
sollen unsere Mock-Objekte ebenfalls start(index)() zulassen. Dabei gibt
es jedoch ein Problem. Mock-Objekte sind standardmäßig zu flexibel: sie
würden auch stort() oder andere falsch geschriebene, umbenannte oder
gelöschte Methoden oder Parameter akzeptieren. Dabei kann es im Laufe der Zeit
zum sog. Mock-Drift kommen, wenn sich die Schnittstelle,
die ihr nachbildet, ändert, euer Mock in eurem Testcode jedoch nicht. Diese Form
des Mock-Drifts kann durch das Hinzufügen von autospec=True zum Mock während
der Erstellung gelöst werden:
@pytest.fixture()
def mock_tasksdb():
with mock.patch.object(tasks, "TasksDB", autospec=True) as MockTasksDB:
yield MockTasksDB.return_value
Üblicherweise wird dieser Schutz mit autospec immer eingebaut. Die einzige
mir bekannte Ausnahme ist, wenn die Klasse oder das Objekt, das gemockt wird,
dynamische Methoden hat oder wenn Attribute zur Laufzeit hinzugefügt werden.
Siehe auch
Die Python-Dokumentation hat einen großen Abschnitt über autospec:
Autospeccing.