c# - 如何在 WPF 中使用异步初始化对 ViewModel 进行单元测试

标签 c# wpf unit-testing mvvm async-await

我已经创建了一个示例 WPF MVVM 项目,我现在想要对其进行单元测试。 View 模型在构造函数中异步加载数据:

public class CustomerOverviewViewModel
{
   public CustomerOverviewViewModel()
   {
       var t = LoadFullCustomerListAsync();
   }
   public async Task LoadFullCustomerListAsync()
   {
      List<BL_acc> customers = await Task.Run(() => // Query from db);
   }
}

在 WPF 中,这就像一个魅力。 当我想为此 View 模型创建单元测试时,我通过调用其默认构造函数来创建对象:

  [TestMethod]
  public void Test()
  {
      customerOverviewViewModel = new CustomerOverviewViewModel();
      // Do the test
  }

但是,单元测试无法知道异步方法何时完成。 可以使用构造函数初始化来解决这个问题,还是应该使用不同的模式?

编辑

单元测试不需要异步加载的信息,它们只需要一个类的实例来测试方法。 仅针对我的单元测试使用另一种初始化方法似乎需要做很多额外的工作。

所有的单元测试都成功了,但它们有时会抛出一个错误,即多个线程试图访问同一个上下文(当数据没有被异步加载时,这个错误就会消失):

创建模型时无法使用上下文。如果在 OnModelCreating 方法内部使用上下文,或者如果多个线程同时访问同一上下文实例,则可能会抛出此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。

最佳答案

In WPF, this works like a charm.

有点。正如目前所写,“初始化”任务只是被忽略了。因此,没有错误处理,也没有向 UI 指示初始化正在进行或已完成(即,它无法知道何时显示微调器)。

换句话说,显示此信息(声明以及结果数据)不仅仅对单元测试代码有用。我有一个简单的 data-bindable task wrapper我刚才写的,以帮助解决这种情况。

如果异步方法返回 Task,则没有其他方法可以检测它们是否完成;您必须以某种方式公开Task。我认为公开它的最佳方式是类似于我编写的类型,以便 UI 也可以使用它。

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

相关文章:

c# - 用空字符串编写 XMLDocument 元素 innertext 添加回车换行符

UserControl 中的 WPF InputBinding 在获得焦点之前不起作用

java - 使用 Spring @Transactional 进行 TestNG 多线程测试

c# - MVC 5 @Html.AntiForgeryToken() 生成具有空值的 html 标签

c# - C#中私有(private)方法的代码风格

c# - 更新 ViewModel 属性时如何避免递归?

Java 测试扫描仪与假用户输入

c++ - 如何在 VS Coded UI Test Builder 的自定义控件中将测试提供程序从 MSAA 切换到 UIA

c# - Umbraco - 如何使用 C# 发布/删除日期

WPF - 在使用 MVVM 的 3 层架构设计中将 DAL 放在哪里?