У меня есть модульный тест (с использованием MSTest), например:
[TestMethod]
public void MyTest()
{
var viewModel = new MyViewModel();
viewModel.Run();
//Assert something here
}
Run - это асинхронный метод, который возвращает void.
Допустим, Run
реализован так:
public async void Run()
{
//Show a busy indicator here
try
{
var result = await myAsyncModelClass.LongRunningOperation();
//Use the results here
}
finally
{
//Hide the busy indicator here
}
}
myAsyncModelClass.LongRunningOperation()
, сам по себе является асинхронным методом, который возвращает значение Task<T>
, где T - результат, который интересует моя ViewModel.
Моя проблема в том, что мой тест запускает метод Run
асинхронно, поэтому мои утверждения вызываются до завершения методов Run
. Как ни странно, b / c блок finally никогда не достигается, когда я ставлю точку останова, поскольку утверждения не выполняются. Как сохранить синхронный метод Run
для возможности его модульного тестирования?
У меня также есть юнит-тест myAsyncModelClass.LongRunningOperation()
, но я просто вызываю Task<T>.Wait()
, так как он возвращает задачу. Это делает его синхронным при модульном тестировании.
Кроме того, я хотел бы отметить, что Run()
магически вызывается ICommand средой MVVM. void
может быть, а может и не быть обязательным типом возврата, мне придется попробовать его.