我有一个单元测试(使用MSTest的)像这样:异步CTP,单元测试视图模型的异步方法
[TestMethod]
public void MyTest()
{
var viewModel = new MyViewModel();
viewModel.Run();
//Assert something here
}
润返回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
方法完成之前调用。奇怪的是,当我放置一个断点时,finally块永远不会到达,因为断言失败。我如何保持Run
方法同步以便能够对其进行单元测试?
我还有一个myAsyncModelClass.LongRunningOperation()
的单元测试,但我只是打电话Task<T>.Wait()
,因为它返回一个任务。这使得单元测试时它是同步的。
另外,我想提一下,Run()
由一个ICommand和一个MVVM框架神奇地调用。 void
可能会或可能不是要求返回类型,我将不得不尝试。
嗨 - 我与C#-async(杀了我的VS安装),但如果它是一个异步函数可以调用运行没有经验? F#有一些类似的构造,但如果你试图调用一个asycn对象,那么你会得到一个编译错误。 - 无论如何,你为什么不把这个包装成一个Task并等待它(或者在你的测试中等待)? – Carsten
我会返回一个任务,但是这个方法也是通过一个绑定到一个ICommand的MVVM框架来调用的。我不相信我的代码会在我的应用程序中执行,如果我做出这样的改变。 – jonathanpeppers