MSTEST0064: Preferuj asynchroniczne metody asercji

Property Value
Identyfikator reguły MSTEST0064
Title Preferuj metody asercji async
Kategoria Zastosowanie
Poprawka jest przełomowa lub nieprzełomowa Non-breaking
Domyślnie włączone Yes
domyślna ciężkość Informacje
wprowadzone w wersji 4.3.0
Czy istnieje poprawka kodu No

Uwaga / Notatka

Ta reguła jest dostępna od msTest 4.3.

Przyczyna

Metoda testowa używa Assert.Throws lub Assert.ThrowsExactly, aby sprawdzić, czy wyjątek jest zgłaszany przez kod asynchroniczny, który blokuje operację asynchroniczną za pomocą GetAwaiter().GetResult().

Opis reguły

Podczas sprawdzania, czy kod asynchroniczny zgłasza wyjątek, preferuj metody asercji asynchronicznej Assert.ThrowsAsync i Assert.ThrowsExactlyAsync zamiast blokować operację asynchroniczną za pomocą GetAwaiter().GetResult(). Blokowanie operacji asynchronicznych może powodować zakleszczenia w niektórych kontekstach synchronizacji i jest mniej czytelne niż równoważna asercja oparta na 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();
    }
}

Jak naprawić naruszenia

Użyj metody asynchronicznej asercji i 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();
    }
}

To samo dotyczy elementu Assert.ThrowsExactly, który ma swój odpowiednik Assert.ThrowsExactlyAsync.

Kiedy pomijać ostrzeżenia

To ostrzeżenie można wyłączyć, gdy otaczającej metody testowej nie można uczynić async (na przykład gdy sygnatura klasy bazowej lub interfejsu wymaga synchronicznego przeciążenia metody testowej) i konieczne jest zachowanie wywołania blokującego.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.