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