C#: Wie kann ich prüfen, "keine Ausnahme" in meinem MSTest unit Tests?
Schreibe ich einen unit-test für diese Methode gibt "void". Ich würde gerne einen Fall, dass der test bestanden wird, wenn keine Ausnahme geworfen. Wie Schreibe ich das in C#?
Assert.IsTrue(????)
(Meine Vermutung ist, dies ist, wie ich sehen sollte, aber was geht in den "???")
Ich hoffe meine Frage ist klar genug.
- Sind Sie mit MSTest oder NUnit?
- In MSTest nicht abgefangene Ausnahmen werden automatisch bewirken, dass tests fehlschlagen. Sind Sie versuchen, Konto für gefangen Ausnahmen?
- Sie können look-up "try-catch für C#" und wird Sie anweisen, wie Sie die Ausnahmen behandeln, die ausgelöst oder nicht ausgelöst wird.
- Wenn NUnit, Blick in Geltend zu machen.Dass( lambda ).Wirft.Nichts (Obwohl ich denke, das ist vor kurzem geändert)
- Ich bin mit MSTest.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre unit-test wird fehlschlagen, jedenfalls, wenn eine Ausnahme geworfen wird - Sie müssen nicht in eine spezielle geltend zu machen.
Dies ist eines der wenigen Szenarien, in denen Sie werden sehen, unit-tests mit keine Behauptungen auf allen - test wird die implizit fehl, wenn eine Ausnahme ausgelöst wird.
Jedoch, wenn Sie wirklich wollen, zu schreiben, eine Behauptung, die für diese - vielleicht, um in der Lage sein, um die Ausnahme zu fangen und Bericht "erwartet keine Ausnahme, sondern habe diese...", Sie können dies tun:
(die oben ist ein Beispiel für NUnit, aber das gleiche gilt für MSTest)
In NUnit, die Sie verwenden können:
geltend zu machen, dass Ihr code nicht eine exception werfen. Obwohl der test würde fehlschlagen, wenn eine Ausnahme geworfen wird, auch wenn es nicht Geltend machen, um damit den Wert dieses Ansatzes ist, dass man dann unterscheiden zwischen unerfüllten Erwartungen und bugs in Ihren tests, und Sie haben die option zum hinzufügen einer benutzerdefinierten Nachricht, die angezeigt wird in der test-Ausgabe. Ein gut formulierter test-Ausgabe kann Ihnen helfen, suchen Sie nach Fehlern in Ihrem code geführt haben, dass ein test fehlschlägt.
Ich denke, es ist gültig zum hinzufügen von tests, um sicherzustellen, dass Ihr code ist nicht das auslösen von Ausnahmen; zum Beispiel, sich vorstellen, Sie sind die Validierung von Eingaben und umwandeln müssen, eine eingehende Zeichenfolge zu lange. Es kann vorkommen, wenn der string null ist, und das ist akzeptabel, so dass Sie wollen sicherstellen, dass die string-Konvertierung nicht eine exception werfen. Wird es daher sein, den code zur Verarbeitung dieser Gelegenheit, und wenn du Sie noch nicht geschrieben, ein test für Sie die fehlende Abdeckung rund um ein wichtiges Stück Logik.
public class TestBase { //believe me, I don't like this anymore than you do. protected void AssertDoesNotThrow(Action action, string message) { try { action(); } catch (Exception) { Assert.Fail(message); } } }
Testen nicht, dass etwas passiert nicht. Es ist wie die Sicherstellung, dass der code nicht brechen. Das ist quasi impliziert, das wir alle anstreben, nicht zu brechen, bug-weniger code. Sie wollen schreiben, tests für, die? Warum nur eine Methode? Wollen Sie nicht alle Ihre Methoden getestet, dass Sie nicht werfen einige Ausnahme? Folgende, der Straße, werden Sie am Ende mit eine zusätzliche, dummy, behaupten-weniger-test für jede Methode in Ihrem code-Basis. Es bringt nicht Wert.
Natürlich, wenn Ihre Forderung ist, um zu überprüfen, Methode hat abfangen von Ausnahmen, die Sie tun, testen Sie das (oder die Umkehrung es ein bisschen; - test, dass es nicht zu werfen, was es soll, zu fangen).
Jedoch der Allgemeine Ansatz/Verfahren bleiben unversehrt, Sie nicht mit dem schreiben von tests für einige künstliche/vage Anforderungen, die aus dem Geltungsbereich des getesteten code (und Test, dass "es funktioniert" oder "nicht werfen" ist in der Regel ein Beispiel für eine solche - insbesondere im Szenario-Methode, wenn die Aufgaben bekannt sind).
Um es einfach auszudrücken - auf das konzentrieren, was Ihr code zu tun hat und testen Sie, dass.
Setting_the_position_to_0_with_zero_backing_streams_should_succeed()
. Ich könnte stattdessen testen, ob die position ist immer noch 0 nach einer Einstellung von 0, in anderen Worten stellen Sie sicher, dass eine Aktion erfolgreich war. Aber ich bin mir nicht sicher, ob dies gilt für alle unit-tests von "sollten Sie nicht throw" geben.Diese helper-Klasse kratzte mein Juckreiz mit MSTest. Vielleicht kann scratch auch für Euch.
Ich mag, um zu sehen, eine
Assert.Whatever
am Ende jedes Tests, nur für die Konsistenz... ohne ein, kann ich sicher sein, dass es nicht sein soll, man es?Für mich, dies ist so einfach wie putting
Assert.IsTrue(true);
Ich wissen ich nicht versehentlich diesen code in es, und so sollte ich selbstbewusst genug, auf die schnelle ein überfliegen, dass dies war, wie gedacht.
Mein Freund Tim erzählte mir von ExpectedException. Ich wirklich wie dieser b/c es ist kurz und bündig, weniger code, und sehr explizit, dass Sie die Prüfung für eine Ausnahme.
Lesen Sie mehr über es hier: ExpectedException-Attribut Zu Verwenden-Verwendung.