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.
| Property | Value |
|---|---|
| Identificador de la regla | MSTEST0049 |
| Title | Token de cancelación de Flow TestContext |
| Category | Usage |
| La corrección es disruptiva o no disruptiva | Non-breaking |
| Habilitado de forma predeterminada | Yes |
| Gravedad predeterminada | Info |
| introducido en la versión | 3.10.0 |
| ¿Hay una corrección de código? | Yes |
Cause
Una llamada de método dentro de un contexto de prueba no usa el CancellationToken elemento disponible desde TestContext cuando el método llamado tiene un parámetro o una sobrecarga que acepta un CancellationToken.
Descripción de la regla
Cuando TestContext esté disponible en los métodos de prueba, debería pasarse su CancellationToken a las operaciones asincrónicas. Esto permite la cancelación cooperativa cuando se producen tiempos de espera y garantiza una limpieza adecuada de los recursos. El TestContext token de cancelación es especialmente importante cuando se usa la cancelación cooperativa con atributos de tiempo de espera.
Esta regla se desencadena cuando:
- Una llamada de método tiene un parámetro opcional CancellationToken que no se proporciona explícitamente.
- Una llamada de método tiene una versión sobrecargada que acepta un CancellationToken, pero en su lugar se utiliza la versión no cancelable.
Cómo corregir infracciones
Utilice el solucionador de código proporcionado para pasar automáticamente el CancellationToken de TestContext a las llamadas a métodos que admitan cancelación. También puede actualizar manualmente las llamadas al método para incluir TestContext.CancellationToken como parámetro.
Ejemplo: Propiedad TestContext
El código siguiente desencadena MSTEST0049 porque Task.Delay y HttpClient.GetAsync aceptan un CancellationToken pero no se pasa ninguno:
[TestClass]
public class MyTestClass
{
public TestContext TestContext { get; set; }
[TestMethod]
public async Task TestMethod()
{
using var client = new HttpClient();
// MSTEST0049: these calls accept a CancellationToken but none is passed
await Task.Delay(1000);
var response = await client.GetAsync("https://example.com");
}
}
La corrección consiste en pasar TestContext.CancellationToken a cada llamada:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestClassCancellationToken
{
// MSTest automatically sets the TestContext property before each test runs.
// MSTest.Analyzers includes a diagnostic suppressor that removes CS8618
// (non-nullable property uninitialized) for this property.
public TestContext TestContext { get; set; }
[TestMethod]
[Timeout(5000, CooperativeCancellation = true)]
public async Task MyAsyncTest()
{
using var client = new HttpClient();
var response = await client.GetAsync(
"https://example.com", TestContext.CancellationToken);
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
Ejemplo: inserción de constructores (MSTest 3.6+)
Con la inserción de constructores, use el _testContext campo para acceder al token de cancelación:
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class TestClassCancellationTokenCtor
{
private readonly TestContext _testContext;
public TestClassCancellationTokenCtor(TestContext testContext)
{
_testContext = testContext;
}
[TestMethod]
[Timeout(5000, CooperativeCancellation = true)]
public async Task MyAsyncTest()
{
using var client = new HttpClient();
var response = await client.GetAsync(
"https://example.com", _testContext.CancellationToken);
Assert.IsTrue(response.IsSuccessStatusCode);
}
}
Cuándo suprimir las advertencias
Suprima esta advertencia si no desea admitir intencionadamente la cancelación de operaciones específicas o si la operación debe continuar incluso cuando se cancele la prueba.
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 MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049
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.MSTEST0049.severity = none
Para obtener más información, consulte Cómo suprimir advertencias de análisis de código.