Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
| Propiedad | Value |
|---|---|
| Identificador de la regla | MSTEST0064 |
| Título | Preferir métodos de aserción asincrónicos |
| Category | Usage |
| La corrección es problemática o no problemática | Non-breaking |
| Habilitado de forma predeterminada | Sí |
| Gravedad predeterminada | Información |
| introducido en la versión | 4.3.0 |
| ¿Hay una corrección de código? | Ninguno |
Nota:
Esta regla está disponible a partir de MSTest 4.3.
Causa
Un método de prueba usa Assert.Throws o Assert.ThrowsExactly para declarar una excepción se produce mediante código asincrónico y bloquea la operación asincrónica mediante GetAwaiter().GetResult().
Descripción de la regla
Al comprobar que una excepción es lanzada por código asíncrono, prefiere los métodos de aserción asíncronos Assert.ThrowsAsync y Assert.ThrowsExactlyAsync en lugar de bloquear la operación asíncrona con GetAwaiter().GetResult(). Bloquear código asincrónico puede provocar interbloqueos en algunos contextos de sincronización y es más difícil de leer que la aserción equivalente basada en 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();
}
}
Cómo corregir infracciones
Utiliza el método de aserción asíncrono y 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();
}
}
Lo mismo se aplica a Assert.ThrowsExactly, que tiene un Assert.ThrowsExactlyAsync homólogo.
Cuándo suprimir las advertencias
Puede suprimir esta advertencia cuando el método de prueba que lo contiene no puede convertirse en async (por ejemplo, debido a una sobrecarga de prueba sincrónica requerida por una clase base o por la firma de una interfaz) y necesita mantener la llamada de bloqueo.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable MSTEST0064
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0064
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad a none en el archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0064.severity = none
Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.