我是单元测试的新手,并尝试为使用任务的WPF ViewModel编写单元测试。我在VM中有一个连接到WPF中的Button的方法。下面的代码总结了我想要做的事情。 类MainPageViewModel { 私人IService服务_;
public void StartTask()
{
var task = service_.StartServiceAsync();
task.ContinueWith(AfterService);
}
private void AfterService(Task<IResult> result)
{
//update UI with result
}
}
class TestClass
{
[TestMethod]
public Test_StartTask()
{
MainPageViewModel vm = new MainPageViewModel();
vm.StartTask();
//need to check if UI is updated but since the AfterService is called on a different thread the assert fails
}
}
在我的测试方法中,我无法在StartTask()调用后编写Assert,请帮助我解决如何处理这种情况? TIA。
答案 0 :(得分:0)
您可以添加同步原语以等待。如果您不希望在生产版本中使用它,则可以使用#if _DEBUG
或#if UNIT_TEST
(其中UNIT_TEST
为特定于测试的构建配置定义)来保护它。
class MainPageViewModel
{
private IService service_;
public AutoResetEvent UpdateEvent = new AutoResetEvent(false);
public void StartTask()
{
var task = service_.StartServiceAsync();
task.ContinueWith(AfterService);
}
private void AfterService(Task<IResult> result)
{
//update UI with result
UpdateEvent.Set();
}
}
class TestClass
{
[TestMethod]
public Test_StartTask()
{
MainPageViewModel vm = new MainPageViewModel();
vm.StartTask();
if( vm.UpdateEvent.WaitOne(5000) ) {
// check GUI state
} else {
throw new Exception("task didn't complete");
}
}
}