Partager via


MSTEST0006 : évitez [ExpectedException]

Propriété Value
Identificateur de la règle MSTEST0006
Titre Évitez [ExpectedException]
Catégorie Concevoir
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut Oui
Gravité par défaut Infos
Introduite dans la version 3.2.0
Existe-t-il une correction de code Oui, à partir de la version 3.7.0

Cause

Une méthode est marquée avec l’attribut [ExpectedException] .

Description de la règle

Privilégiez Assert.ThrowsException ou Assert.ThrowsExceptionAsync (ou Assert.ThrowsExactly/Assert.Throws ou Assert.ThrowsExactlyAsync/Assert.ThrowsAsync si vous utilisez MSTest 3.8 ou une version ultérieure) plutôt que l'attribut [ExpectedException] car cela garantit que seule la ligne de code attendue lance l'exception attendue, au lieu d'agir sur l'ensemble du corps du test. Les API Assert offrent également une plus grande flexibilité et vous permettent d’affirmer des propriétés supplémentaires de l’exception.

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

Comment corriger les violations

Remplacez l'utilisation de l'attribut [ExpectedException] par un appel à Assert.ThrowsException ou Assert.ThrowsExceptionAsync (ou Assert.ThrowsExactly/Assert.Throws ou Assert.ThrowsExactlyAsync/Assert.ThrowsAsync si vous utilisez MSTest 3.8 ou une version ultérieure).

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

Quand supprimer les avertissements

Il est plus sûr de supprimer ce diagnostic lorsque la méthode ne comprend qu’une simple ligne.

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

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.