gpt4 book ai didi

wpf - 如何使用 ViewModelLocator 进行单元测试

转载 作者:行者123 更新时间:2023-12-04 17:31:02 26 4
gpt4 key购买 nike

我已经使用 Autofac 创建了一个自定义 View 模型定位器,并通过 App.xaml 正常设置它,就像通常使用它们中的大多数一样。我的问题是我现在如何进行单元测试?每次我尝试测试初始化​​ View 的方法时都会出错

在我的 app.xaml 中:

<desktop:ViewModelLocator xmlns:local="clr-namespace:MyProject.Desktop" x:Key="ViewModelLocator" />

在每个 View 中:

DataContext="{Binding MyFirstViewModel, Source={StaticResource ViewModelLocator}}"

单元测试错误:
{"Cannot find resource named 'ViewModelLocator'. Resource names are case sensitive."}

我明白为什么在您进行单元测试时,实际上没有实际应用程序的实例,那么解决这个问题的好方法是什么?

ViewModelLocator 代码:

/// <summary>
/// Autofac object container
/// </summary>
private readonly IContainer objectContainer;

#region Constructor

/// <summary>
/// Constructor for view model locator
/// </summary>
public ViewModelLocator()
{
objectContainer = App.ObjectContainer;
//objectContainer.BeginLifetimeScope();
}

#endregion

#region Properties

/// <summary>
/// Gets the resolved instance of a main window view model
/// </summary>
public MainWindowViewModel MainWindowViewModel
{
get
{
return objectContainer.Resolve<MainWindowViewModel>();
}
}

public FirstViewModel MyFirstViewModel
{
get
{
return objectContainer.Resolve<FirstViewModel>();
}
}

public SecondViewModel MySecondViewModel
{
get
{
return objectContainer.Resolve<SecondViewModel>();
}
}

最佳答案

这有点晚了,但也许有用。而不是在构造函数中解析 objectContainer ,而是通过属性来完成:

//note this is a lazy getter, i.e. will be resolved when needed on the first call
private IContainer ObjectContainer
{
get
{
if(objectContainer == null)
objectContainer = App.ObjectContainer;
return objectContainer:
}
}

然后通过您的代码使用该属性,而不是该字段。此外,当我担心其他人使用我想通过属性使用强制执行的字段时,我会将其重命名为在 IntelliSence 中不容易识别的名称(例如 zREgdnlksfObjectContainer :))注意该属性是私有(private)的,所以没有什么真正改变。您可以将属性设置为内部并将您的库标记为对您的单元测试可见,以便在单元测试中您可以将其模拟为 WhenCalled()返回/解析 IContainer。

关于wpf - 如何使用 ViewModelLocator 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20764350/

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