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