gpt4 book ai didi

c# - 如何使用异步方法对 ViewModel 进行单元测试。

转载 作者:太空狗 更新时间:2023-10-29 22:33:00 25 4
gpt4 key购买 nike

我不确定从哪里开始,但让我简要介绍一下我的现状和我想要实现的目标。我对 MVVM 上的单元测试还很陌生,并且很难测试我使用 PRISM 委托(delegate)命令属性公开的命令。我的委托(delegate)命令调用必须等待的异步方法,以便我可以获得实际结果。下面是我要测试的方法调用的异步方法。

 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
}
}
}

这也是我的 VM 中调用上述异步方法的命令

  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 这是因为它不等待异步方法完成。我知道堆栈溢出中已经有一些与此相关的主题,但我找不到与我的 DelegateCommands 相关的内容。

最佳答案

您的方法 GetTasksAsync 应该返回一个任务,这样您就可以真正等待它了。

我推荐this series Channel9特地this episode解释你的问题。

只是要明确:只需将 GetTasksAsync 的签名更改为

Task GetTasksAsync();

允许您这样做:

var t = GetAsync();
t.Wait();
Assert(...);

如果您真的想在单元测试中测试命令而不是命令实际调用的方法,您可以在 ViewModel 中使用一个字段来存储要等待的任务(不太干净)或用其他东西替换您的 DelegateCommand就像这篇文章中描述的那样:Awaitable DelegateCommand

更新:除了博客文章之外,考虑到您正在使用 PRISM,您应该看看 Project Kona来自与 PRISM 相同的团队。他们实际上实现了DelegateCommand to support AsyncHandlers

关于c# - 如何使用异步方法对 ViewModel 进行单元测试。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15631635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com