Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Property | Value |
|---|---|
| Идентификатор правила | MSTEST0049 |
| Title | Маркер отмены Flow TestContext |
| Category | Usage |
| Исправление является разрушающим или неразрушающим | Non-breaking |
| Включен по умолчанию | Yes |
| Серьезность по умолчанию | Info |
| представлено в версии | 3.10.0 |
| Существует ли исправление кода | Yes |
Cause
Вызов метода в тестовом контексте не использует доступное значение CancellationToken, когда метод TestContext имеет параметр или перегрузку, принимающую CancellationToken.
Описание правила
Когда TestContext доступен в методах тестирования, его следует передавать CancellationToken в асинхронные операции. Это позволяет совместную отмену в случае истечения времени ожидания и гарантирует правильную очистку ресурсов. Маркер TestContext отмены особенно важен при использовании кооперативной отмены с атрибутами тайм-аута.
Это правило активируется, если:
- Вызов метода имеет необязательный CancellationToken параметр, который явно не указан.
- Вызов метода имеет перегрузку, принимающую CancellationToken, но вместо этого используется невозвратная перегрузка.
Устранение нарушений
Используйте предоставленный исправитель кода для автоматической передачи CancellationToken в TestContext вызовы метода, поддерживающие отмену. Можно также вручную обновить вызовы метода для включения TestContext.CancellationToken в качестве параметра.
Пример: свойство TestContext
Следующий код вызывает MSTEST0049, поскольку Task.Delay и HttpClient.GetAsync принимают CancellationToken, но его не передают.
[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");
}
}
Исправление заключается в передаче TestContext.CancellationToken для каждого вызова.
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);
}
}
Пример: внедрение конструктора (MSTest 3.6+)
При внедрении через конструктор используйте поле _testContext для доступа к маркеру отмены.
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);
}
}
Когда следует подавлять предупреждения
Отключите это предупреждение, если вы намеренно не хотите поддерживать отмену для определенных операций или если операция должна продолжаться даже при отмене теста.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0049.severity = none
Дополнительные сведения см. в разделе "Подавление предупреждений анализа кода".