Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| 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.