我已经创建了一个示例 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/