Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何使用ViewModelLocator进行单元测试_Wpf_Unit Testing_Mvvm_Viewmodellocator - Fatal编程技术网

Wpf 如何使用ViewModelLocator进行单元测试

Wpf 如何使用ViewModelLocator进行单元测试,wpf,unit-testing,mvvm,viewmodellocator,Wpf,Unit Testing,Mvvm,Viewmodellocator,我使用Autofac创建了一个自定义视图模型定位器,并通过App.xaml正常设置它,就像大多数常用的定位器一样。我的问题是现在如何进行单元测试?每次尝试测试初始化视图的方法时,我都会遇到一个错误 在my app.xaml中: 在每个视图中: DataContext=“{Binding MyFirstViewModel,Source={StaticResource ViewModelLocator}” 单元测试错误: {"Cannot find resource named 'ViewMo

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

在my app.xaml中:


在每个视图中:

DataContext=“{Binding MyFirstViewModel,Source={StaticResource ViewModelLocator}”
单元测试错误:

{"Cannot find resource named 'ViewModelLocator'. Resource names are case sensitive."}
我理解为什么当你进行单元测试时,实际上没有一个实际应用的实例,那么解决这个问题的好方法是什么呢

ViewModelLocator代码:

//
///对象容器
/// 
私有只读IContainer对象容器;
#区域构造函数
/// 
///视图模型定位器的构造函数
/// 
公共ViewModelLocator()
{
objectContainer=App.objectContainer;
//objectContainer.BeginLifetimeScope();
}
#端区
#区域属性
/// 
///获取主窗口视图模型的已解析实例
/// 
公共主窗口视图模型主窗口视图模型
{
得到
{
返回objectContainer.Resolve();
}
}
公共第一视图模型MyFirstViewModel
{
得到
{
返回objectContainer.Resolve();
}
}
public SecondViewModel MySecondViewModel
{
得到
{
返回objectContainer.Resolve();
}
}

这有点晚了,但可能有用。不要在构造函数中解析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中不易识别的内容(例如:ZRegDNLksObjectContainer。))注意,属性是私有的,因此没有任何真正的更改。您可以将属性设置为内部,并将库标记为对单元测试可见,以便在单元测试中可以将其模拟为
WhenCalled()
return/resolve IContainer

单元测试的目标应该是
ViewModel类(业务逻辑)
,而不是视图。如果在ViewModel类中初始化视图,则设计中存在严重错误。是的,但此视图模型更像是动态创建/设置视图的容器视图模型(IView),并在xamlI的内容控件中使用它们。不过,我确实明白您的观点,我将尝试看看是否可以选择在xaml中设置所有视图,而不是视图。此外,我喜欢在视图模型中设置视图(如果适用),因为这是最接近于对实际视图进行单元测试的事情。现在我知道你要说什么了“为什么我要尝试测试我的视图?”测试覆盖率越高,应用程序的质量就越好。这一切都是基于意见的。如果你喜欢那样,那就由你决定。我不会对此发表评论。圣诞快乐。。!!