我是单元测试 MVVM 的新手,并在我的项目中使用 PRISM。我正在我们当前的项目上实施单元测试,并且没有运气在线找到资源来告诉我如何测试调用异步方法的 DelegateCommand。这是我的帖子的后续问题 -如何使用异步方法对 ViewModel 进行单元测试。关于如何在 MVVM 中对异步方法进行单元测试,并回答说可以使用异步 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 这是因为它不等待异步方法完成。