MSTEST0049: Token de cancelamento do Flow TestContext

Property Value
ID da regra MSTEST0049
Title Token de cancelamento do Flow TestContext
Category Usage
A correção é invasiva ou não invasiva Non-breaking
Ativado por padrão Yes
Severidade padrão Info
Introduzido na versão 3.10.0
Existe uma correção de código Yes

Cause

Uma chamada de método dentro de um contexto de teste não usa o CancellationToken disponível de TestContext quando o método chamado tem um parâmetro ou sobrecarga que aceita um CancellationToken.

Descrição da regra

Quando TestContext estiver disponível nos seus métodos de teste, deve encaminhar CancellationToken para operações assíncronas. Isso permite o cancelamento cooperativo quando ocorrem tempos limite e garante a limpeza adequada dos recursos. O TestContext token de cancelamento é especialmente importante ao usar o cancelamento cooperativo com atributos de tempo limite.

Esta regra é acionada quando:

  • Uma chamada de método tem um parâmetro opcional CancellationToken que não é fornecido explicitamente.
  • Uma chamada de método tem uma sobrecarga que aceita um CancellationToken, mas em vez disso, é utilizada a sobrecarga não cancelável.

Como corrigir violações

Utilize o corretor de código fornecido para passar automaticamente CancellationToken para as chamadas de método em TestContext que suportam cancelamento. Você também pode atualizar manualmente as chamadas de método para incluir TestContext.CancellationToken como parâmetro.

Exemplo: propriedade TestContext

O seguinte código dispara MSTEST0049 porque Task.Delay e HttpClient.GetAsync aceitam um CancellationToken mas nenhum é passado:

[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");
    }
}

A solução é passar TestContext.CancellationToken para cada chamada:

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);
    }
}

Exemplo: injeção de construtor (MSTest 3.6+)

Com a injeção de construtores, use o campo _testContext para aceder ao token de cancelamento.

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);
    }
}

Quando suprimir avisos

Suprima esse aviso se você intencionalmente não quiser oferecer suporte ao cancelamento para operações específicas ou se a operação continuar mesmo quando o teste for cancelado.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

#pragma warning disable MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.MSTEST0049.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.