我有一个单元测试(使用 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()
它是由 MVVM 框架神奇地由 ICommand 调用的。 void
可能是也可能不是需要返回类型,我将不得不尝试一下。