Freigeben über


MSTEST0049: Laufzeitkontext-Abbruchtoken

Property Value
Regel-ID MSTEST0049
Title AblauftestContext-Abbruchtoken
Category Usage
Korrektur ist blockierend oder nicht-blockierend Non-breaking
Standardmäßig aktiviert Yes
Voreingestellte Schwere Info
wurde in Version eingeführt. 3.10.0
Gibt es eine Codekorrektur Yes

Cause

Ein Methodenaufruf innerhalb eines Testkontexts nutzt die von CancellationToken verfügbaren TestContext nicht, wenn die aufgerufene Methode einen Parameter oder eine Überladung hat, die ein CancellationToken akzeptiert.

Regelbeschreibung

Wenn TestContext in Ihren Testmethoden verfügbar ist, sollten Sie CancellationToken an asynchrone Operationen weiterleiten. Dies ermöglicht einen kooperativen Abbruch, wenn Timeouts auftreten, und stellt eine ordnungsgemäße Ressourcenbereinigung sicher. Das TestContext Abbruchtoken ist besonders wichtig bei der Verwendung eines kooperativen Abbruchs mit Timeout-Attributen.

Diese Regel wird in folgenden Fällen ausgelöst:

  • Ein Methodenaufruf verfügt über einen optionalen CancellationToken Parameter, der nicht explizit bereitgestellt wird.
  • Ein Methodenaufruf verfügt über eine Überladung, die ein CancellationToken akzeptiert, aber statt dessen wird die nicht abbruchbare Überladung verwendet.

Wie man Verstöße behebt

Verwenden Sie das bereitgestellte Codekorrekturwerkzeug, um das CancellationToken automatisch an Methodenaufrufe zu übergeben, die den TestContext-Abbruch unterstützen. Sie können Methodenaufrufe auch manuell aktualisieren, um TestContext.CancellationToken als Parameter einzuschließen.

Beispiel: TestContext-Eigenschaft

Der folgende Code löst MSTEST0049 aus, da Task.Delay und HttpClient.GetAsync ein CancellationToken akzeptieren, aber keiner übergeben wird:

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

Der Fix besteht darin, TestContext.CancellationToken an jeden Aufruf zu übergeben.

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

Beispiel: Konstruktor-Injektion (MSTest 3.6+)

Verwenden Sie bei der Konstruktoreinfügung das _testContext Feld, um auf das Abbruchtoken zuzugreifen:

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

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie diese Warnung, wenn Sie absichtlich keinen Abbruch für bestimmte Vorgänge unterstützen möchten oder wenn der Vorgang fortgesetzt werden soll, auch wenn der Test abgebrochen wird.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad auf none in der Konfigurationsdatei fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.