Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Property | Value |
|---|---|
| Kural Kimliği | MSTEST0049 |
| Title | Flow TestContext iptal belirteci |
| Category | Usage |
| Düzeltme kırılgan mı yoksa sağlam mı | Non-breaking |
| Varsayılan olarak etkin | Yes |
| Varsayılan önem derecesi | Info |
| , sürümünde tanıtıldı. | 3.10.0 |
| bir kod düzeltmesi var mı? | Yes |
Cause
Test bağlamındaki bir yöntem çağrısı, çağrılan yöntem bir CancellationToken kabul eden bir parametre veya aşırı yükleme içerdiğinde CancellationToken'yi TestContext'den kullanmaz.
Kural açıklaması
Test yöntemlerinizde TestContext kullanılabilir olduğunda, bunu CancellationToken zaman uyumsuz işlemlere aktarmanız gerekir. Bu, zaman aşımları meydana geldiğinde işbirliğiyle iptali sağlar ve kaynakların düzgün bir şekilde temizlendiğinden emin olur. İptal TestContext belirteci, özellikle zaman aşımı öznitelikleriyle işbirlikli iptal kullanıldığında önemlidir.
Bu kural şu durumlarda tetikler:
- Yöntem çağrısının açıkça sağlanmayan isteğe bağlı CancellationToken bir parametresi vardır.
- Yöntem çağrısı, bir kabul eden CancellationToken bir aşırı yüklemeye sahiptir, ancak bunun yerine iptal edilemeyen aşırı yükleme kullanılır.
İhlalleri düzeltme
Sağlanan kod düzelticisini kullanarak CancellationToken iptali destekleyen yöntem çağrılarına TestContext'ı otomatik olarak iletin. Yöntem çağrılarını ayrıca TestContext.CancellationToken parametre olarak ekleyerek el ile de güncelleştirebilirsiniz.
Örnek: TestContext özelliği
Aşağıdaki kod, MSTEST0049'u tetikler çünkü Task.Delay ve HttpClient.GetAsync bir CancellationToken kabul eder ama hiçbiri iletilmez.
[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");
}
}
Düzeltme, her bir çağrıya TestContext.CancellationToken geçirerek yapılır.
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);
}
}
Örnek: oluşturucu ekleme (MSTest 3.6+)
Oluşturucu enjeksiyonu ile, _testContext iptal belirtecine erişmek için alanı kullanın.
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);
}
}
Uyarıların ne zaman bastırılması gerekiyor?
Belirli işlemler için iptali kasıtlı olarak desteklemek istemiyorsanız veya test iptal edildiğinde bile işlemin devam etmesi gerekiyorsa bu uyarıyı gizleyin.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable MSTEST0049
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0049
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, none önem derecesini olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0049.severity = none
Daha fazla bilgi için bkz. Kod analizi uyarılarını gizleme.