MSTEST0049: Flow TestContext iptal belirteci

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.