Wie testet man asynchronen Code mit MSTest?

87

Ich schreibe einen super einfachen asynchronen Code. Speichern Sie einfach eine Datei außerhalb des Threads.

Ich möchte diesen Code mit dem MSTest-Unit-Test-Framework in Microsoft Visual Studio Team System 2008 testen.

Wie mache ich das?

Ich möchte die Testmethode einfach blockieren, bis die Methode zurückkehrt. Ich kann mir einige Möglichkeiten vorstellen, dies zu tun, aber ich bin überwältigt, dass es keine Best Practices oder Hilfsklassen gibt.

Ich sehe viel für Silverlight, aber nichts generisches.

Kevin Moore
quelle
4
Duplikat? stackoverflow.com/questions/1174702/… (Ich denke, die bereitgestellten Antworten beziehen sich nicht direkt auf das verwendete Testframework )
Fredrik Mörk
1
Ja, das ist es - und die Antwort wird dieselbe sein, denke ich.
Andras Zoltan

Antworten:

157

Visual Studio 2012 (früher als "Visual Studio 11" bekannt) führte die Unterstützung für asynchrone Tests ein . Es sieht aus wie das:

[TestMethod]
public async Task FooTest()
{
   var result = await SomeAsyncOperation();
   Assert.IsTrue(someCondition);
}

Wie in den Kommentaren erwähnt, ist der TaskRückgabetyp wichtig . Es funktioniert nicht, wenn Sie die Methode als zurückgegeben deklarieren void.

Wim Coenen
quelle
58
Beachten Sie, dass der TaskRückgabetyp obligatorisch ist - voidfunktioniert nicht (zumindest nicht bei VS2013 Update 4)
Ohad Schneider
3
(Es wird nie funktionieren, da das voidZurückkehren von asynchronen Methoden nicht erwartet werden kann)
Richard Szalay
1
@ RichardSzalay: Es kann zum Laufen gebracht werden, sehen Sie hier, wie NUnit es macht: stackoverflow.com/questions/15031681/…
Wim Coenen
-2

Verwenden Sie stattdessen die SystemWrapper- Bibliothek, anstatt die System.IO-Methoden direkt aufzurufen . Dann können Sie in Ihren Tests die Aufrufe nach Belieben verspotten, alles, was Sie möchten, einschließlich Fehlerbedingungen, zu Ihrem Test zurückbringen und überprüfen, ob Ihre Logik wie erwartet funktioniert.

Wenn Sie ein Beispiel sehen möchten, schauen Sie sich diesen Blog-Beitrag an, der zeigt, wie es mit RhinoMocks verwendet werden kann.

Richard Banks
quelle
2
Ich sehe dies nicht als Antwort auf die Frage
SteveC