MSTEST0064: Föredrar asynkrona kontrollmetoder

Property Value
Regel-ID MSTEST0064
Title Använd helst asynkrona asserteringsmetoder
Kategori Användning
Korrigeringen är antingen brytande eller icke-brytande Non-breaking
Aktiverad som standard Yes
Standard allvarlighetsgrad Info
introducerades i version 4.3.0
Finns det en kodkorrigering No

Anmärkning

Den här regeln är tillgänglig från och med MSTest 4.3.

Orsak

En testmetod använder Assert.Throws eller Assert.ThrowsExactly för att kontrollera att ett undantag genereras av kod som är asynkron och blockerar den asynkrona åtgärden med hjälp av GetAwaiter().GetResult().

Regelbeskrivning

När du hävdar att ett undantag genereras av asynkron kod föredrar du asynkrona kontrollmetoder Assert.ThrowsAsync och Assert.ThrowsExactlyAsync över blockering av den asynkrona åtgärden med GetAwaiter().GetResult(). Blockering av asynkron kod kan orsaka dödlägen i vissa synkroniseringskontexter och är svårare att läsa än motsvarande await-baserade försäkran.

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test_ThrowsOnAsyncCall()
    {
        // Violation: blocks the async call inside Assert.Throws.
        Assert.Throws<InvalidOperationException>(() => DoAsync().GetAwaiter().GetResult());
    }

    private static async Task DoAsync()
    {
        await Task.Yield();
        throw new InvalidOperationException();
    }
}

Så här åtgärdar du överträdelser

Använd den asynkrona assertionsmetoden och await den:

[TestClass]
public class TestClass
{
    [TestMethod]
    public async Task Test_ThrowsOnAsyncCall()
    {
        await Assert.ThrowsAsync<InvalidOperationException>(() => DoAsync());
    }

    private static async Task DoAsync()
    {
        await Task.Yield();
        throw new InvalidOperationException();
    }
}

Detsamma gäller för Assert.ThrowsExactly, som har en Assert.ThrowsExactlyAsync motsvarighet.

När du ska ignorera varningar

Du kan ignorera den här varningen när den innehållande testmetoden inte kan göras async (till exempel en synkron testöverlagring som krävs av en basklass eller gränssnittssignatur) och du måste behålla blockeringsanropet.

Undertryck en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.