async void
testów jednostkowych nie można uruchomić w programie Visual Studio 2012:
[TestClass]
public class MyTestClass
{
[TestMethod]
public async void InvisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
}
Jeśli chcę mieć asynchroniczny test jednostkowy, metoda testowa musi zwrócić Task:
[TestMethod]
public async Task VisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
Dlaczego tak się dzieje? Nie to, żebym absolutnie potrzebował async void
metody testowej, jestem po prostu ciekawy. Program Visual Studio 2012 nie wyświetla żadnego ostrzeżenia ani błędu podczas tworzenia async void
metody testowej, mimo że nie będzie można jej uruchomić ...
async void
testy, a informacje o tym, jak i dlaczego je wspierać, są w pewnym stopniu opisane w tym linku . Zobacz odpowiedź poniżej.Dzieje się tak dlatego, że MSTest nie obsługuje
async void
testów jednostkowych. Jest to możliwe , aby to zrobić, wprowadzając kontekst, w którym można je wykonać.MSTest tego nie obsługuje, prawdopodobnie dlatego, że Microsoft zdecydował, że była to zbyt duża zmiana dla istniejących testów (możliwe, że istniejące testy zablokowałyby się, gdyby nadano im nieoczekiwany kontekst).
Nie ma żadnego ostrzeżenia / błędu kompilatora, ponieważ jest to całkowicie prawidłowy kod C #. Jedynym powodem, dla którego nie działa, jest struktura testów jednostkowych (tj. Uważam, że xUnit obsługuje
async void
testy) i byłoby rażącym naruszeniem oddzielenia obaw dla kompilatora C #, aby spojrzeć na twoje atrybuty, ustalić, używasz MSTest i zdecydujesz, że naprawdę nie chcesz go używaćasync void
.źródło
W VS2015 stwierdziłem, że żadne metody testowe udekorowane async nie będą wyświetlane w Eksploratorze testów. Skończyło się na usunięciu słowa kluczowego async i zamianie wywołania await w teście na task.Wait () i wykonałem swoje asercje na task.Result.
Wydaje się, że działa dobrze. Nie próbowałem tego jeszcze z testowaniem wyjątków.
var task = TheMethodIWantToTestAsync(someValue); task.Wait(); var response = task.Result; Assert.IsNotNull(response); Assert.IsTrue(response.somevalue);
źródło