Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| 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.