MSTEST0064: Preferisce i metodi di asserzione asincrona

Proprietà Value
ID regola MSTEST0064
Titolo Preferisce i metodi di asserzione asincrona
Categoria Utilizzo
La modifica è dirompente o non dirompente Non-breaking
Abilitato per impostazione predefinita
Gravità predefinita Informazioni
introdotta nella versione 4.3.0
È presente una correzione del codice No

Annotazioni

Questa regola è disponibile a partire da MSTest 4.3.

Cause

Un metodo di test usa Assert.Throws o Assert.ThrowsExactly per asserire un'eccezione viene generata dal codice che è asincrono e blocca l'operazione asincrona usando GetAwaiter().GetResult().

Descrizione regola

Quando si verifica che il codice asincrono generi un'eccezione, preferire i metodi di asserzione asincrona Assert.ThrowsAsync e Assert.ThrowsExactlyAsync al blocco dell'operazione asincrona con GetAwaiter().GetResult(). Bloccare il codice asincrono può causare deadlock in alcuni contesti di sincronizzazione ed è più difficile da leggere rispetto all'asserzione equivalente basata su await.

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

Come correggere le violazioni

Usa il metodo di asserzione asincrona e await:

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

Lo stesso vale per Assert.ThrowsExactly, che ha una Assert.ThrowsExactlyAsync controparte.

Quando eliminare gli avvisi

È possibile disattivare questo avviso quando il metodo di test che lo contiene non può essere reso async (ad esempio, nel caso di un overload di test sincrono richiesto da una classe di base o dalla firma di un'interfaccia) ed è necessario mantenere la chiamata bloccante.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità su none nel file di configurazione .

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.