Jak przetestować kod asynchroniczny przy użyciu MSTest

88

Piszę super prosty kod asynchroniczny. Po prostu zapisuję plik poza wątkiem.

Chciałbym przetestować ten kod przy użyciu struktury testów jednostkowych MSTest w Microsoft Visual Studio Team System 2008.

Jak mam to zrobic?

Chciałbym po prostu zablokować metodę testową do momentu jej powrotu. Mogę sobie wyobrazić kilka sposobów, aby to zrobić, ale jestem zszokowany, że nie ma wokół tego żadnych najlepszych praktyk ani zajęć pomocniczych.

Dużo widzę w przypadku Silverlight, ale nic ogólnego.

Kevin Moore
źródło
4
Duplikować? stackoverflow.com/questions/1174702/… (myślę, że podane odpowiedzi nie są bezpośrednio związane z tym, który framework testowy jest używany)
Fredrik Mörk
1
tak jest - i myślę, że odpowiedź będzie taka sama.
Andras Zoltan

Odpowiedzi:

163

W programie Visual Studio 2012 (wcześniej znanym jako „Visual Studio 11”) wprowadzono obsługę testów asynchronicznych . To wygląda tak:

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

Jak zauważył w komentarzach, typ zwracany jest ważne . Nie zadziała, jeśli zadeklarujesz metodę jako zwracającą .Taskvoid

Wim Coenen
źródło
59
Zwróć uwagę, że Tasktyp zwrotu jest obowiązkowy - voidnie zadziała (przynajmniej nie w aktualizacji 4 VS2013)
Ohad Schneider,
3
(To nigdy nie zadziała, ponieważ void-powrotne metody asynchroniczne nie mogą być oczekiwane)
Richard Szalay
1
@RichardSzalay: można to wykorzystać, zobacz tutaj, jak to robi NUnit: stackoverflow.com/questions/15031681/ ...
Wim Coenen
-3

Zamiast bezpośrednio wywoływać metody System.IO, spróbuj zamiast tego użyć biblioteki SystemWrapper . Następnie w testach możesz mockować wywołania, jak chcesz, zwracać cokolwiek zechcesz z powrotem do testu, w tym warunki błędów, i sprawdzić, czy Twoja logika działa zgodnie z oczekiwaniami.

Jeśli chcesz zobaczyć przykład, spójrz na ten wpis na blogu pokazujący, jak można go używać z RhinoMocks.

Richard Banks
źródło
3
Nie widzę w tym odpowiedzi na pytanie
SteveC