MSTEST0064 : préférer les méthodes d’assertion asynchrones

Propriété Value
Identificateur de la règle MSTEST0064
Titre Préférer les méthodes d’assertion asynchrone
Catégorie Usage
Le correctif a un effet disruptif ou non disruptif Non-breaking
Activé par défaut Oui
Sévérité par défaut Informations
Introduit dans la version 4.3.0
Existe-t-il une correction de code No

Note

Cette règle est disponible à partir de MSTest 4.3.

Cause

Une méthode de test utilise Assert.Throws ou Assert.ThrowsExactly pour vérifier qu’une exception est levée par du code asynchrone et pour bloquer l’opération asynchrone à l’aide de GetAwaiter().GetResult().

Description de la règle

Lors de la vérification qu’une exception est levée par du code asynchrone, préférez les méthodes d’assertion asynchrones Assert.ThrowsAsync et Assert.ThrowsExactlyAsync plutôt que de bloquer l’opération asynchrone avec GetAwaiter().GetResult(). Le blocage sur le code asynchrone peut entraîner des blocages dans certains contextes de synchronisation et est plus difficile à lire que l’assertion basée sur l’équivalent await.

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test_ThrowsOnAsyncCall()
    {
        // Violation: blocks the async call inside Assert.Throws.
        Assert.Throws<InvalidOperationException>(() => DoAsync().GetAwaiter().GetResult());
    }

    private static async Task DoAsync()
    {
        await Task.Yield();
        throw new InvalidOperationException();
    }
}

Comment corriger les violations

Utilisez la méthode d’assertion asynchrone et await :

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test_ThrowsOnAsyncCall()
    {
        await Assert.ThrowsAsync<InvalidOperationException>(() => DoAsync());
    }

    private static async Task DoAsync()
    {
        await Task.Yield();
        throw new InvalidOperationException();
    }
}

La même chose s’applique à Assert.ThrowsExactly, qui a un Assert.ThrowsExactlyAsync équivalent.

Quand supprimer les avertissements

Vous pouvez supprimer cet avertissement lorsque la méthode de test englobante ne peut pas être déclarée async (par exemple, lorsqu’une surcharge de test synchrone est requise par une classe de base ou la signature d’une interface) et que vous devez conserver l’appel bloquant.

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 MSTEST0064
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0064

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.MSTEST0064.severity = none

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