Partilhar via


MSTEST0058: Evite asserções nos catch blocos

Propriedade Valor
ID da regra MSTEST0058
Título Evitar asserções em blocos de captura
Categoria Usage
A correção é invasiva ou não invasiva Non-breaking
Ativado por padrão Yes
Severidade padrão Informações
Introduzido na versão 4.1.0
Existe uma correção de código Não

Motivo

Um método de teste contém instruções de asserção dentro de um catch bloco.

Descrição da regra

Colocar asserções em catch blocos é um anti-padrão que pode levar a resultados de testes confusos e torna os testes mais difíceis de compreender. Quando uma exceção é lançada, o bloco catch é executado e a afirmação é verificada. No entanto, se não for lançada nenhuma exceção, o catch bloco nunca se executa, podendo dar falsa confiança de que o teste passou.

Em vez disso, utilize Assert.Throws ou métodos semelhantes para verificar se as exceções esperadas são lançadas. Isto torna a intenção do teste mais clara e garante o comportamento adequado do teste.

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

Como corrigir violações

Use Assert.Throws, Assert.ThrowsExactly ou métodos de asserção relacionados para testar exceções.

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

Quando suprimir avisos

Pode suprimir este aviso se tiver uma necessidade legítima de apanhar uma exceção e realizar uma validação complexa que não pode ser facilmente expressa usando métodos padrão de afirmação. No entanto, considere refatorar o seu teste para usar primeiro afirmações de exceção mais explícitas.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.