MSTEST0064: Preferir métodos de asserção assíncrona

Property Valor
ID da regra MSTEST0064
Título Preferir métodos de asserção assíncrona
Categoria Uso
Correção interruptiva ou sem interrupção Non-breaking
Habilitado por padrão Yes
Severidade padrão Informações
introduzido na versão 4.3.0
Há uma correção de código No

Note

Essa regra está disponível a partir do MSTest 4.3.

Cause

Um método de teste usa Assert.Throws ou Assert.ThrowsExactly para afirmar que uma exceção é gerada por código que é assíncrono e bloqueia a operação assíncrona usando GetAwaiter().GetResult().

Descrição da regra

Ao verificar se uma exceção é lançada por um código assíncrono, prefira os métodos de asserção assíncrona Assert.ThrowsAsync e Assert.ThrowsExactlyAsync em vez de bloquear a operação assíncrona com GetAwaiter().GetResult(). Bloquear código assíncrono pode causar deadlocks em alguns contextos de sincronização e é mais difícil de ler do que a asserção equivalente baseada em 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();
    }
}

Como corrigir violações

Use o método de asserção assíncrona 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();
    }
}

O mesmo se aplica a Assert.ThrowsExactly, que tem um Assert.ThrowsExactlyAsync equivalente.

Quando suprimir avisos

Você pode suprimir este aviso quando o método de teste que o contém não pode ser transformado em async (por exemplo, uma sobrecarga síncrona de teste exigida por uma classe base ou pela assinatura de uma interface) e é necessário manter a chamada de bloqueio.

Suprimir um aviso

Se você quiser suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar a regra e, em seguida, habilitá-la novamente.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.