Udostępnij za pośrednictwem


MSTEST0006: Unikaj [ExpectedException]

Właściwości Wartość
Identyfikator reguły MSTEST0006
Tytuł Unikać [ExpectedException]
Kategoria Projektowanie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone Tak
Ważność domyślna Informacje
Wprowadzone w wersji 3.2.0
czy istnieje poprawka kodu Tak, począwszy od wersji 3.7.0

Przyczyna

Metoda jest oznaczona atrybutem [ExpectedException] .

Opis reguły

Preferuj Assert.ThrowsException lub Assert.ThrowsExceptionAsync (lub Assert.ThrowsExactly/Assert.Throws lub Assert.ThrowsExactlyAsync/Assert.ThrowsAsync, jeśli używasz MSTest 3.8 i nowszych) zamiast atrybutu [ExpectedException], ponieważ zapewnia to, że tylko oczekiwany wiersz kodu zgłasza oczekiwany wyjątek, zamiast wpływać na całą zawartość testu. Interfejsy API asercji zapewniają również większą elastyczność i umożliwiają uzyskanie dodatkowych właściwości wyjątku.

[TestClass]
public class TestClass
{
    [TestMethod]
    [ExpectedException(typeof(InvalidOperationException))] // Violation
    public void TestMethod()
    {
        // Arrange
        var person = new Person
        {
            FirstName = "John", 
            LastName = "Doe",
        };
        person.SetAge(-1);

        // Act
        person.GrowOlder();
    }
}

Jak naprawić naruszenia

Zastąp użycie atrybutu [ExpectedException] wywołaniem metody Assert.ThrowsException lub Assert.ThrowsExceptionAsync (lub Assert.ThrowsExactly/Assert.Throws lub Assert.ThrowsExactlyAsync/Assert.ThrowsAsync, jeśli używasz biblioteki MSTest 3.8 lub nowszej).

[TestClass]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
        // Arrange
        var person = new Person
        {
            FirstName = "John", 
            LastName = "Doe",
        };
        person.SetAge(-1);

        // Act
        Assert.ThrowsExactly(() => person.GrowOlder());
    }
}

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć tę diagnostykę, gdy metoda jest jedną liniową.

[TestClass]
public class TestClass
{
    [TestMethod]
    [ExpectedException(typeof(ArgumentNullException))]
    public void TestMethod()
    {
        new Person(null);
    }
}

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji .

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia analizy kodu.