Testen von Events ohne Rückgabe
Beim Testen von Software gibt es einige Grenzfälle. Es gibt z.B. Bibliotheken die statische Methoden verwenden, die sich erst einmal nicht testen lassen. Es gibt riesengroße Methoden, deren Seiteneffekte komplett unbeherrschbar sind. Aber auch wenn man richtig guten Code schreibt und seinen Quelltext für das Testen optimiert, gibt es immer noch Situationen, in denen es einem schwer fällt, Tests zu schreiben.
Da ich sehr viel mit Events programmiere, gab es eine Sache die mich sehr gestört hat. Wenn eine Methode ein Event
mit new
erstellt und keinen Rückgabewert zurück gibt, kann man nichts testen. So dachte ich jedenfalls. Nach einem
Gespräch mit Yanick Witschi auf der Contao Konferenz 2019 musste ich feststellen, dass es
sehr wohl eine Lösung gibt. Man kann beim Mocken der dispatch
-Methode des EventDispatchers statt eines Event-Objekts,
einen Callback
übergeben. In diesem kann man dann das Event prüfen und manipulieren, um die weitere Verarbeitung der aufrufenden
Methode zu beeinflussen.
Hier ein Beispiel:
In Zeile 6 erstellen wir zunächst ein Mock des EventDispatchers. In der Zeile 8 sagen wir, dass wir erwarten, dass er genau einmal aufgerufen wird. In Zeile 9 legen wir den Namen der Methode fest, von der wir erwarten, dass sie aufgerufen wird. Der eigentliche Callback beginnt in Zeile 12. Wir verwenden eine anonyme Funktion, der unser Event übergeben wird. In diesem Event können wir Werte prüfen (Zeile 14) oder ändern (Zeile 15).
Wichtig ist, dass wir einen boolschen Wert zurückgeben. Eigentlich ist der Callback für eine manuelle Prüfung von Werten
gedacht und wir sagen mit true
dass der Test bestanden wurde und mit false
dass er fehlgeschlagen ist. Wenn wir
Assertions verwenden, um unser Event zu prüfen, wird diese Zusicherung über Erfolg oder Misserfolg des Tests
entscheiden. Wir können also beruhigt immer true
zurückgeben.
Kommentare
Einen Kommentar schreiben