Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Property | Value |
|---|---|
| Regel-ID | MSTEST0064 |
| Title | Geef de voorkeur aan asynchrone assertiemethoden |
| Categorie | Gebruik |
| Fix kan brekend of niet-brekend zijn | Non-breaking |
| standaard ingeschakeld | Yes |
| standaardniveau van ernst | Informatie |
| geïntroduceerd in versie | 4.3.0 |
| Is er een oplossing voor de code | No |
Note
Deze regel is beschikbaar vanaf MSTest 4.3.
Oorzaak
Een testmethode gebruikt Assert.Throws of Assert.ThrowsExactly om te controleren of een uitzondering wordt gegenereerd door asynchrone code die de asynchrone bewerking blokkeert met behulp van GetAwaiter().GetResult().
Beschrijving van regel
Als u controleert of asynchrone code een uitzondering genereert, gebruikt u bij voorkeur de asynchrone assert-methoden Assert.ThrowsAsync en Assert.ThrowsExactlyAsync in plaats van de asynchrone bewerking te blokkeren met GetAwaiter().GetResult(). Het blokkeren van asynchrone code kan in sommige synchronisatiecontexten deadlocks veroorzaken en is moeilijker te lezen dan de equivalente op await gebaseerde assertie.
[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();
}
}
Hoe schendingen op te lossen
Gebruik de asynchrone assertiemethode en await doe het volgende:
[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();
}
}
Hetzelfde geldt voor Assert.ThrowsExactly, dat een Assert.ThrowsExactlyAsync tegenhanger heeft.
Wanneer waarschuwingen onderdrukken
U kunt deze waarschuwing onderdrukken wanneer de omvattende testmethode niet kan worden gemaakt tot async (bijvoorbeeld vanwege een synchrone testoverload die wordt vereist door de handtekening van een basisklasse of interface) en u de blokkerende aanroep moet behouden.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable MSTEST0064
// The code that's violating the rule is on this line.
#pragma warning restore MSTEST0064
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst ervan in op none in het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.MSTEST0064.severity = none
Zie Hoe u codeanalysewaarschuwingen kunt onderdrukken voor meer informatie.