MSTEST0064: Voorkeur geven aan asynchrone assertiemethoden

Property Value
Regel-ID MSTEST0064
Title Geef de voorkeur aan asynchrone assertiemethoden
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Non-breaking
standaard ingeschakeld Yes
standaardniveau van ernst Informatie
geïntroduceerd in versie 4.3.0
Is er een oplossing voor de code No

Note

Deze regel is beschikbaar vanaf MSTest 4.3.

Oorzaak

Een testmethode gebruikt Assert.Throws of Assert.ThrowsExactly om te controleren of een uitzondering wordt gegenereerd door asynchrone code die de asynchrone bewerking blokkeert met behulp van GetAwaiter().GetResult().

Beschrijving van regel

Als u controleert of asynchrone code een uitzondering genereert, gebruikt u bij voorkeur de asynchrone assert-methoden Assert.ThrowsAsync en Assert.ThrowsExactlyAsync in plaats van de asynchrone bewerking te blokkeren met GetAwaiter().GetResult(). Het blokkeren van asynchrone code kan in sommige synchronisatiecontexten deadlocks veroorzaken en is moeilijker te lezen dan de equivalente op await gebaseerde assertie.

[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();
    }
}

Hoe schendingen op te lossen

Gebruik de asynchrone assertiemethode en await doe het volgende:

[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();
    }
}

Hetzelfde geldt voor Assert.ThrowsExactly, dat een Assert.ThrowsExactlyAsync tegenhanger heeft.

Wanneer waarschuwingen onderdrukken

U kunt deze waarschuwing onderdrukken wanneer de omvattende testmethode niet kan worden gemaakt tot async (bijvoorbeeld vanwege een synchrone testoverload die wordt vereist door de handtekening van een basisklasse of interface) en u de blokkerende aanroep moet behouden.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.

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

Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.