MSTEST0067: Evitar el bloqueo sincrónico de llamadas en código de prueba

Propiedad Value
Identificador de la regla MSTEST0067
Título Evitar llamadas de bloqueo sincrónicas en el código de pruebas
Category Usage
La corrección es problemática o no problemática Non-breaking
Habilitado de forma predeterminada Ninguno
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. De forma predeterminada, está deshabilitada. Se activa como advertencia cuando se establece <MSTestAnalysisMode>All</MSTestAnalysisMode>.

Causa

El código de prueba usa una llamada de bloqueo sincrónica como Thread.Sleep, Task.Wait, Task.WaitAll, Task.WaitAnyo Task<TResult>.Result.

La regla se activa en los métodos marcados con TestMethodAttribute (incluidos los atributos personalizados que heredan de él) y en los métodos de accesorio marcados con TestInitializeAttribute, TestCleanupAttribute, ClassInitializeAttribute, ClassCleanupAttributeAssemblyInitializeAttribute, , AssemblyCleanupAttribute, GlobalTestInitializeAttributey GlobalTestCleanupAttribute.

Descripción de la regla

El bloqueo sincrónico del hilo actual dentro de los métodos de prueba o los entornos de prueba es una causa habitual de inestabilidad y también puede provocar un interbloqueo cuando el marco de pruebas ejecuta pruebas en un contexto de sincronización que requiere una programación cooperativa. Es preferible utilizar await Task.Delay para las esperas basadas en el tiempo y await para que la tarea observe su resultado.

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test()
    {
        Thread.Sleep(1000); // Violation
        var result = ComputeAsync().Result; // Violation
        ComputeAsync().Wait(); // Violation
    }

    private static Task<int> ComputeAsync() => Task.FromResult(42);
}

Cómo corregir infracciones

Use el equivalente asincrónico:

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test()
    {
        await Task.Delay(1000);
        var result = await ComputeAsync();
    }

    private static Task<int> ComputeAsync() => Task.FromResult(42);
}

Cuándo suprimir las advertencias

Esta regla está desactivada por defecto. Cuando se active esta opción, se omitirán las apariciones individuales en las que la espera sincrónica sea intencionada e inevitable; por ejemplo, al interactuar con una API sincrónica que no se pueda convertir en asincrónica.

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

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

Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.