Compartilhar via


MSTEST0006: evite [ExpectedException]

Propriedade Valor
ID da regra MSTEST0006
Título Evite [ExpectedException]
Categoria Criar
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão Sim
Severidade padrão Informações
Introduzido na versão 3.2.0
Há uma correção de código Sim, a partir da versão 3.7.0

Causa

Um método é marcado com o atributo [ExpectedException].

Descrição da regra

Prefira Assert.ThrowsException ou Assert.ThrowsExceptionAsync (ou Assert.ThrowsExactly/Assert.Throws ou Assert.ThrowsExactlyAsync/Assert.ThrowsAsync se estiver usando o MSTest 3.8 e posterior) em vez do atributo [ExpectedException], pois garante que apenas a linha de código esperada gere a exceção esperada, em vez de agir em todo o corpo do teste. As APIs de declaração também fornecem mais flexibilidade e permitem que você declare propriedades extras da exceção.

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

Como corrigir violações

Substitua o uso do atributo [ExpectedException] por uma chamada para Assert.ThrowsException ou Assert.ThrowsExceptionAsync (ou Assert.ThrowsExactly/Assert.Throws ou Assert.ThrowsExactlyAsync/Assert.ThrowsAsync se estiver usando o MSTest 3.8 e posterior).

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

Quando suprimir avisos

É seguro suprimir esse diagnóstico quando o método for de uma linha.

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