MSTEST0049: token de cancelación de Flow TestContext

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.