我是单元测试MVVM的新手,并在我的项目中使用PRISM.我正在我们当前的项目上实现单元测试,没有运气在线查找资源,这将告诉我如何调用异步方法的totest 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里也是我的VM中的命令,它调用上面的异步方法
this.GetTasksCommand = new DelegateCommand(this.GetTasks);
void GetTasks()
{
GetTasksAsync();
}
Run Code Online (Sandbox Code Playgroud)
现在我的测试方法就像
[TestMethod]
public …Run Code Online (Sandbox Code Playgroud) 我不知道从哪里开始,但让我简要介绍一下我在哪里以及我想要实现的目标.我对MVVM上的单元测试很陌生,并且很难测试我使用PRISM委托命令属性公开的命令.我的委托命令调用必须等待的异步方法,以便我可以获得实际结果.下面是一个asyc方法,由我想测试的方法调用.
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里也是我的VM中的命令,它调用上面的异步方法
this.GetTasksCommand = new DelegateCommand(this.GetTasks);
void GetTasks()
{
GetTasksAsync();
}
Run Code Online (Sandbox Code Playgroud)
现在我的测试方法就像
[TestMethod]
public void Command_Test_GetTasksCommand()
{
MyViewModel.GetTaskCommand.Execute(); // this should populate …Run Code Online (Sandbox Code Playgroud) 我有一个数据网格绑定到我的ViewModel的集合.其中一列的值具有非常特定于业务需求的值.在此列上,它可以包含字母数字字符.
例如,我可以具有列值A1,A20,AA,AA12,AAA.现在我想自定义这个值的排序,比方说我希望大多数字母的内容应该先排或等等.使用DataGrid进行默认排序,但只进行常规排序.
我的问题是你将如何通过MVVM实现这一点?我们可以通过订阅代码中的事件并重新安排整个集合来逃避这一点.然而,这不是我想要的,我正在寻找关于如何处理这个问题的建议或解决方案.
我发现这个链接在datagrid列上使用绑定数据和转换器对DataGrid附加属性进行排序,但我想要做的是在每次用户单击此列时附加要更新的属性.是否可以在DataGrid列中附加属性?
可能重复:使用绑定数据和转换器对datagrid列进行排序,但这不是使用MVVM.