Поделиться через


MSTEST0006. Избегайте [ExpectedException]

Свойство Значение
Идентификатор правила MSTEST0006
Заголовок Избегать [ExpectedException]
Категория Проект
Исправление является критическим или не критическим Не критическое
Включен по умолчанию Да
Серьезность по умолчанию Сведения
Представлено в версии 3.2.0
Есть ли исправление кода? Да, начиная с версии 3.7.0

Причина

Метод помечается атрибутом [ExpectedException] .

Описание правила

Предпочитайте Assert.ThrowsException или Assert.ThrowsExceptionAsync (или Assert.ThrowsExactly/Assert.Throws или Assert.ThrowsExactlyAsync/Assert.ThrowsAsync при использовании MSTest 3.8 и более поздних версий) над атрибутом [ExpectedException], так как это гарантирует, что только ожидаемая строка кода создает ожидаемое исключение, а не действует на весь текст теста. API утверждений также обеспечивают большую гибкость и позволяют утверждать дополнительные свойства исключения.

[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();
    }
}

Устранение нарушений

Замените использование атрибута [ExpectedException] вызовом Assert.ThrowsException или Assert.ThrowsExceptionAsync (или Assert.ThrowsExactly/Assert.Throws или Assert.ThrowsExactlyAsync/Assert.ThrowsAsync при использовании MSTest 3.8 и более поздних версий).

[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());
    }
}

Когда лучше отключить предупреждения

Это безопасно, чтобы отключить эту диагностику, если метод является однострочный.

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

Подавление предупреждения

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность в файле конфигурации.

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

Дополнительные сведения см. в статье Подавление предупреждений анализа кода.