MSTEST0064: preferir métodos de aserción asincrónicos

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
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.