MSTEST0058: Избегайте утверждений в catch блоках

Недвижимость Ценность
Идентификатор правила MSTEST0058
Заголовок Избегайте утверждений в блоках catch
Категория Usage
Исправление является разрушающим или неразрушающим Non-breaking
Включен по умолчанию Да
Серьезность по умолчанию Info
представлено в версии 4.1.0
Существует ли исправление кода нет

Причина

Метод тестирования содержит операторы утверждений внутри блока catch.

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

Размещение утверждений в catch блоках является анти-шаблоном, который может привести к запутанным результатам теста и делает тесты более сложными для понимания. При возникновении исключения выполняется блок catch, после чего выполняется утверждение. Однако если исключение не возникает, блок catch никогда не выполняется, потенциально создавая ложное чувство уверенности, что тест прошел.

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

[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
        }
    }
}

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

Используйте Assert.Throws, Assert.ThrowsExactly или связанные методы утверждения для проверки исключений.

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

Когда следует подавлять предупреждения

Вы можете отключить это предупреждение, если у вас есть законная необходимость перехватывать исключение и выполнять сложную проверку, которая не может быть легко выражена с помощью стандартных методов утверждения. Однако сначала рассмотрите возможность рефакторинга теста, чтобы использовать более явные утверждения исключений.

Отключение предупреждений

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

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

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

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

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