我刚接触单元测试的MVVM和使用PRISM在我的项目中。我正在实现当前项目的单元测试,但无法找到在线资源告诉我如何测试调用异步方法的DelegateCommand。这是对我发布的文章“如何测试带有异步方法的ViewModel”的追问,想要测试MVVM中的异步方法,回答是可以使用async TestMethod测试公共方法。但只适用于我想要测试的方法是公共方法时才有效。
问题是我想测试我的DelegateCommand,因为这些是我想要在其他类中公开的唯一公共细节,而其他所有细节都是私有的。我可以将私有方法公开为公共方法,但我永远不会这样做,因为这是一个糟糕的设计。我不确定该如何解决这个问题 - 是否需要测试DelegateCommand,还是有其他方法?我想知道其他人是如何处理这种情况的,并引导我走向正确的方向。
以下是我的代码:
async void GetTasksAsync()
{
this.SimpleTasks.Clear();
Func<IList<ISimpleTask>> taskAction = () =>
{
var result = this.dataService.GetTasks();
if (token.IsCancellationRequested)
return null;
return result;
};
IsBusyTreeView = true;
Task<IList<ISimpleTask>> getTasksTask = Task<IList<ISimpleTask>>.Factory.StartNew(taskAction, token);
var l = await getTasksTask; // waits for getTasksTask
if (l != null)
{
foreach (ISimpleTask t in l)
{
this.SimpleTasks.Add(t); // adds to ViewModel.SimpleTask
}
}
}
以下是在我的虚拟机中调用上述异步方法的命令。
this.GetTasksCommand = new DelegateCommand(this.GetTasks);
void GetTasks()
{
GetTasksAsync();
}
现在我的测试方法如下:
[TestMethod]
public void Command_Test_GetTasksCommand()
{
MyViewModel.GetTaskCommand.Execute(); // this should populate ViewModel.SimpleTask
Assert.IsTrue(MyBiewModel.SimpleTask != null)
}
目前我遇到的问题是,我的ViewModel.SimpleTask = null,这是因为它没有等待异步方法完成。
async
处理程序的DelegateCommand
,而不是如何创建这样的命令。 - zmechanic