Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| 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 | Sì |
| 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.