Ich habe mehrere Unittests für dieses Muster:
%Vor%Es stellt sich heraus, dass Code Coverage die Wurflinie als Half-Run markiert, also bekomme ich jedes Mal einen Block unbedeckten Code.
Nachdem ich eine Weile über dieses Problem nachgedacht hatte, war die beste Lösung, die ich mir vorstellen konnte, ein Versuch / Fang. Da dies ein sich wiederholendes Muster ist, werde ich eine Hilfsmethode nach den Regeln von
erstellen %Vor%Das hätte den netten Nebeneffekt, dass ich alle Ausnahmetests zu den Tests ohne Werfen hinzufügen könnte.
Ist das ein gültiger Entwurf, oder habe ich etwas vermisst?
Bearbeiten: Ugs ... scheint so zu sein, dass die obige ExpectException-Methode mich auch mit 1 unbedeckten Block belässt.
Was Sie vorschlagen, ist gültig. Abgesehen von Ihrem Code-Coverage-Problem würde ich sagen, dass es besser ist, als das Attribut ExpectedException
zu verwenden, da es explizit anzeigt, welche Zeile des Tests die Ausnahme auslösen soll. Die Verwendung von ExpectedException
bedeutet, dass die beliebige Codezeile im Test den erwarteten Ausnahmetyp auslösen kann und der Test trotzdem bestanden wird. Wenn der Fehler von einem anderen Aufruf stammt, von dem nicht erwartet wurde, dass er ausgelöst wird, kann dies die Tatsache verschleiern, dass der Test fehlschlagen sollte, weil die Zeile, die geworfen werden soll, nicht vorhanden ist.
Was wäre eine nützliche Änderung an dem, was Sie vorgeschlagen haben, würde die gefangene Ausnahme zurückgeben:
%Vor%Dies würde es dem Testcode ermöglichen, die Ausnahme weiter geltend zu machen, wenn es gewünscht wird (dh um zu prüfen, ob eine bestimmte Nachricht verwendet wurde).
NUnit (obwohl es nicht so aussieht, als würden Sie es verwenden, da Sie ein TestMethod
-Attribut haben) hat ein eingebautes Konstrukt ähnlich dem, was Sie vorgeschlagen haben:
@adrianbanks Die ExpectException funktioniert nicht wie erwartet, wenn der Aktionsparameter eine andere Ausnahme als die erwartete Ausnahme auslöst:
%Vor%Wenn ich die Testmethode "mein_test" ausführe, habe ich gerade eine Nachricht erhalten, dass die Testmethode ausgelöst wurde und System.ArgumentException: hallo. In diesem Fall sollte "Expected InvalidOperationException" angezeigt werden. Ich schlage eine neue Version für die ExpectException-Methode vor:
%Vor%Ich weiß, das ist ein altes Thema, aber ich stieß auf das gleiche Problem.
Schließlich habe ich mich selbst gefragt: Warum muss ich die Abdeckung der Tests wissen? Ich tue das nicht! - Also lasst uns sie ausschließen, also ist die Berichterstattung sauberer.
In meinem Testprojekt habe ich eine CodeCoverage.runsettings
Datei hinzugefügt und das ist der Inhalt:
Nach Auswahl dieser Testeinstellungen Datei ist mein Code Coverage 100%
Auf diese Weise ist es nicht notwendig, das System zur Abdeckung des Test-Code-Codes zu "hacken", nur um 100% zu erreichen: -)
Tags und Links c# unit-testing expected-exception