Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Property | Value |
|---|---|
| Identyfikator reguły | MSTEST0049 |
| Title | Token anulowania Flow TestContext |
| Category | Usage |
| Poprawka jest przełomowa lub nieprzełomowa | Non-breaking |
| Domyślnie włączone | Yes |
| domyślna ciężkość | Info |
| wprowadzone w wersji | 3.10.0 |
| Czy istnieje poprawka kodu | Yes |
Cause
Wywołanie metody w kontekście testowym nie korzysta z dostępnego CancellationToken z TestContext, gdy wywołana metoda ma parametr lub przeciążenie akceptujące CancellationToken.
Opis reguły
Jeśli TestContext jest dostępne w twoich metodach testowych, należy przekazać jego CancellationToken do operacji asynchronicznych. Dzięki temu można anulować współpracę, gdy wystąpią przekroczenia limitu czasu i zapewni prawidłowe czyszczenie zasobów. TestContext Token anulowania jest szczególnie ważny przy korzystaniu z współpracy w anulowaniu z atrybutami limitu czasu.
Ta reguła jest wyzwalana, gdy:
- Wywołanie metody ma opcjonalny CancellationToken parametr, który nie jest jawnie podany.
- Wywołanie metody ma przeciążenie, które akceptuje CancellationToken , ale zamiast tego jest używane przeciążenie, które nie można anulować.
Jak naprawić naruszenia
Użyj dostarczonego narzędzia do naprawy kodu, aby automatycznie przekazać CancellationToken z TestContext do wywołań metod, które obsługują anulowanie. Można również ręcznie zaktualizować wywołania metod w celu uwzględnienia TestContext.CancellationToken jako parametru.
Przykład: właściwość TestContext
Poniższy kod wyzwala MSTEST0049, ponieważ Task.Delay i HttpClient.GetAsync akceptują element CancellationToken, ale żaden nie został przekazany.
[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");
}
}
Poprawka polega na przekazaniu TestContext.CancellationToken do każdego wywołania:
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);
}
}
Przykład: wstrzykiwanie konstruktora (MSTest 3.6+)
Za pomocą iniekcji konstruktora _testContext użyj pola, aby uzyskać dostęp do tokenu anulowania:
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);
}
}
Kiedy pomijać ostrzeżenia
Pomiń to ostrzeżenie, jeśli celowo nie chcesz obsługiwać anulowania dla określonych operacji lub jeśli operacja powinna być kontynuowana nawet po anulowaniu testu.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0049.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.