Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.