【发布时间】:2011-11-07 19:27:34
【问题描述】:
我有一个像这样的单元测试(使用 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 可能是也可能不是需要返回类型,我将不得不尝试一下。
【问题讨论】:
-
嗨 - 我对 C#-async 没有经验(杀死了我的 VS 安装),但如果它是异步函数,你可以调用 Run 吗? F# 有一些类似的结构,但如果您尝试调用 asycn 对象,则会出现编译错误。 - 无论如何,你为什么不把它包装成一个任务并等待它(或者你在测试中的等待)?
-
我会返回一个任务,但是 MVVM 框架也通过绑定到 ICommand 来调用此方法。如果我进行更改,我不相信我的代码会在我的应用程序中执行。
标签: c# .net wpf mvvm async-ctp