webentwicklung-frage-antwort-db.com.de

Warum können Komponententests für "asynchrone Leere" nicht erkannt werden?

async void Unit-Tests können nicht in Visual Studio 2012 ausgeführt werden:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

Wenn ich einen asynchronen Komponententest haben möchte, muss die Testmethode eine Aufgabe zurückgeben:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

Wieso ist es so? Nicht, dass ich unbedingt eine async void - Testmethode haben muss, ich bin nur neugierig. Visual Studio 2012 gibt keine Warnung oder Fehlermeldung aus, wenn Sie eine async void - Testmethode erstellen, obwohl diese nicht ausgeführt werden kann ...

74
Max

async void Methoden sollten als "Feuer und Vergessen" betrachtet werden - es gibt keine Möglichkeit zu warten, bis sie beendet sind. Wenn Visual Studio einen dieser Tests starten würde, könnte es nicht warten, bis der Test abgeschlossen ist (als erfolgreich markiert), oder alle Ausnahmen abfangen, die ausgelöst wurden.

Mit einem async Task kann der Aufrufer warten, bis die Ausführung abgeschlossen ist, und alle während der Ausführung ausgelösten Ausnahmen abfangen.

Siehe diese Antwort für mehr Diskussion von async void vs async Task.

77
Richard

Dies liegt nur daran, dass MSTest keine Unit-Tests async void Unterstützt. Es ist möglich, dies zu tun, indem ein Kontext eingeführt wird, in dem sie ausgeführt werden können.

MSTest unterstützt dies nicht, wahrscheinlich, weil Microsoft festgestellt hat, dass es sich um eine zu große Änderung für vorhandene Tests handelt (es ist möglich, dass vorhandene Tests blockieren, wenn sie einen unerwarteten Kontext erhalten).

Es gibt keine Compiler-Warnung/Fehler, da es sich um einen vollständig gültigen C # -Code handelt. Der einzige Grund, warum es nicht funktioniert, liegt am Unit-Test-Framework (dh ich glaube, dass xUnit async void - Tests unterstützt), und es wäre ein schwerwiegender Verstoß gegen die Trennung von Bedenken, wenn der C # -Compiler nachschaut Stellen Sie an Ihren Attributen fest, dass Sie MSTest verwenden, und entscheiden Sie, dass Sie async void wirklich nicht verwenden möchten.

21
Stephen Cleary

In VS2015 wurde festgestellt, dass mit Async dekorierte Testmethoden im Test Explorer nicht angezeigt werden. Schließlich entfernte ich das Schlüsselwort async und ersetzte den Aufruf await im Test durch eine task.Wait () und stellte meine Aufgaben auf task.Result.

Scheint in Ordnung zu sein. Ich habe es noch nicht mit Ausnahmetests versucht.

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);
19
Nick Wright