Sdílet prostřednictvím


MSTEST0051: Assert.Throws by měl obsahovat pouze jeden příkaz.

Vlastnictví Hodnota
Identifikátor pravidla MSTEST0051
Titul Assert.Throws by měl obsahovat pouze jeden příkaz.
Kategorie Usage
Oprava je destruktivní nebo nedestruktivní Non-breaking
Povoleno ve výchozím nastavení Ano
Výchozí úroveň závažnosti Informace
Představeno ve verzi 3.11.0
Existuje oprava kódu. Ne

Příčina

Volání na Throws, ThrowsAsync, ThrowsExactly nebo ThrowsExactlyAsync obsahuje více příkazů v akčním delegátu.

Popis pravidla

Aby se zajistilo, že se testuje pouze konkrétní volání metody, které má vyvolat výjimku, delegát akce předaný Assert.Throwsdo , Assert.ThrowsAsync, Assert.ThrowsExactlynebo Assert.ThrowsExactlyAsync by měl obsahovat přesně jeden příkaz. Zahrnutí více příkazů může vést k úspěšnému absolvování testů, pokud je výjimka vyvolána příkazem, který není zamýšlen k tomu, aby vyvolal výjimku. Pokud není posledním příkazem v akci, která je určena k vyvolání, test obsahuje mrtvý kód. Pokud se jedná o poslední příkaz, měl by být záměr jasně uveden.

Jak opravit porušení

Refaktorujte test, abyste zajistili, že delegát akce obsahuje pouze jediný příkaz, který má vyvolat výjimku. Přesuňte veškerý instalační kód mimo volání kontrolního výrazu.

Změňte například toto:

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    Assert.ThrowsExactly<InvalidOperationException>(() =>
    {
        obj.Initialize();
        obj.Execute(); // Only this should be inside the assertion
    });
}

Na toto:

[TestMethod]
public void TestMethod()
{
    var obj = new MyClass();
    obj.Initialize();
    Assert.ThrowsExactly<InvalidOperationException>(() => obj.Execute());
}

Kdy potlačit upozornění

Nepotlačujte upozornění z tohoto pravidla. Zahrnutím více příkazů do delegáta akce může způsobit nejasnosti, která operace se testuje, a může vést k úspěšnému absolvování testů při porušení původního záměru.