MSTEST0049: token anulowania elementu TestContext przepływu

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.