Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| 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.