Artikel
von
© Copyright bei Patrick Froch und easy Solutions IT. Dieses Werk ist lizenziert unter Creative Commons BY-NC-SA.

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.

Zurück

Kommentare

Einen Kommentar schreiben

Bitte rechnen Sie 3 plus 7.