Freigeben über


MSTEST0058: Vermeiden von Assertionen in catch Blöcken

Eigentum Wert
Regel-ID MSTEST0058
Title Vermeiden von Assertionen in Catch-Blöcken
Kategorie Usage
Die Behebung ist eingreifend oder nicht eingreifend Non-breaking
Standardmäßig aktiviert Yes
Voreingestellte Schwere Info
wurde in Version eingeführt. 4.1.0
Gibt es eine Codekorrektur Nein

Ursache

Eine Testmethode enthält Assertionsanweisungen innerhalb eines catch Blocks.

Regelbeschreibung

Das Platzieren von Assertionen in catch Blöcken ist ein Antimuster, das zu verwirrenden Testergebnissen führen kann und Tests schwieriger zu verstehen macht. Wenn eine Ausnahme ausgelöst wird, wird der catch Block ausgeführt, und die Assertion wird ausgeführt. Wenn jedoch keine Ausnahme ausgelöst wird, wird der catch Block niemals ausgeführt, was möglicherweise fälschlicherweise den Eindruck erweckt, dass der Test erfolgreich war.

Verwenden Sie Assert.Throws stattdessen oder ähnliche Methoden, um zu überprüfen, ob erwartete Ausnahmen ausgelöst werden. Dadurch wird die Testabsicht klarer und das ordnungsgemäße Testverhalten sichergestellt.

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
        try
        {
            // Code that might throw.
            DoSomethingThatMightThrow();
        }
        catch (Exception ex)
        {
            Assert.AreEqual("Expected error message", ex.Message); // Violation
        }
    }
}

Wie man Verstöße behebt

Verwenden Sie Assert.Throws, Assert.ThrowsExactly oder verwandte Assertionsmethoden, um Ausnahmen zu testen.

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestMethod_ThrowsExceptionWithExpectedMessage()
    {
        InvalidOperationException exception = Assert.Throws<InvalidOperationException>(() => DoSomethingThatMightThrow());
        Assert.AreEqual("Expected error message", exception.Message);
    }
}

Wann sollten Warnungen unterdrückt werden?

Sie können diese Warnung unterdrücken, wenn Sie eine legitime Notwendigkeit haben, eine Ausnahme abzufangen und komplexe Überprüfungen durchzuführen, die nicht einfach mithilfe von Standard assertionsmethoden ausgedrückt werden können. Erwägen Sie jedoch die Umgestaltung Ihres Tests, um explizitere Ausnahme assertionen zuerst zu verwenden.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable MSTEST0058
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0058

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, setzen Sie dessen Schweregrad auf none in der Konfigurationsdatei fest.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0058.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.