Gibt es eine spezielle Unterstützung von Nunit wenn man mit Callbacks arbeitet? Oder eine Best Practice, wie man das am besten anstellt?
Bisher komme ich zurecht, nur stelle ich mir vor, dass ich mit folgendem Vorgehen bald sehr komplizierte Tests schreiben werde. Zumindest sobald mein Code wächst und ich mehr im Detail testen will.
Hier ein vereinfachtes Beispiel meiner derzeitigen Tests mit Callbacks. Die geteste Klasse ruft einen Delegaten auf sobald bestimmte XML Knoten gefunden werden. Das xml-Objekt wird im Test SetUp erstellt. Im Beispiel teste ich ob das gefundene Element aus dem XML richtig erkannt wird und speichere die erkannten Daten in Attributen meiner TestKlasse. Diese kann ich anschließend per Assert testen.
[Test] public void NewElement() { String xmlString = @"<elem></elem>";
this.xml.InputStream = new StringReader(xmlString); this.xml.NewElement += this.NewElementCallback;
Anonyme Methoden sind da schon ganz praktisch. Nur sollte man auf jeden Fall auch noch darauf achten bzw. es testen, dass das Event auch ausgelöst wird. In deinem Beispiel hättest du auch einen bestandenen Test auch wenn NewElement nicht ausgelöst wird.
Die einfachste Lösung für dieses Problem ist, eine Zählervariable außerhalb der anonymen Methode mit auf 0 zu initialisieren, sie innerhalb der anonymen Methode um 1 zu erhöhen, und am Ende der Testmethode zu prüfen, ob der Wert auf 1 steht.
Damit ermittelt man nicht nur, ob der Eventhandler überhaupt ausgelöst wurde, sondern auch, dass er nicht mehr als einmal ausgelöst wurde.