Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Property | Value |
|---|---|
| ID regola | MSTEST0049 |
| Title | Token di annullamento di Flow TestContext |
| Category | Usage |
| La modifica è dirompente o non dirompente | Non-breaking |
| Abilitato per impostazione predefinita | Yes |
| Gravità predefinita | Info |
| introdotta nella versione | 3.10.0 |
| È presente una correzione del codice | Yes |
Cause
Una chiamata al metodo all'interno di un contesto di test non usa l'oggetto CancellationToken disponibile da TestContext quando il metodo chiamato ha un parametro o un overload che accetta un oggetto CancellationToken.
Descrizione della regola
Quando TestContext è disponibile nei metodi di test, dovresti trasmetterne il CancellationToken alle operazioni asincrone. Ciò consente l'annullamento cooperativo quando si verificano timeout e garantisce una corretta pulizia delle risorse. Il TestContext token di annullamento è particolarmente importante quando si usa l'annullamento cooperativo con attributi di timeout.
Questa regola viene attivata quando:
- Una chiamata al metodo ha un parametro facoltativo che non viene fornito in modo esplicito CancellationToken .
- Una chiamata al metodo ha un overload che accetta un oggetto CancellationToken, ma viene utilizzato l'overload non cancellabile.
Come correggere le violazioni
Usa il correttore di codice fornito per passare automaticamente CancellationToken alle chiamate di metodo che supportano l'annullamento TestContext. È anche possibile aggiornare manualmente le chiamate ai metodi da includere TestContext.CancellationToken come parametro.
Esempio: proprietà TestContext
Il codice seguente attiva MSTEST0049 perché Task.Delay e HttpClient.GetAsync accettano un CancellationToken ma non ne viene passato nessuno:
[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 correzione consiste nel passare TestContext.CancellationToken a ogni chiamata:
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);
}
}
Esempio: iniezione del costruttore (MSTest 3.6+)
Con l'iniezione del costruttore, usare il campo _testContext per accedere al token di annullamento.
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 eliminare gli avvisi
Eliminare questo avviso se intenzionalmente non si vuole supportare l'annullamento per operazioni specifiche o se l'operazione deve continuare anche quando il test viene annullato.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0049.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.