如何在ChildViewModel
中模拟ChildrenViewModel
的创建:
IChildViewModel c = new ChildViewModel(child);
children.Add(c);
我正在使用
ChildViewModel
(没有ChildView
!),因为Child
(模型)类未实现INotifyPropertyChanged
。 更新:我引入封装ChildViewModel
的Child
的原因之一是验证要求。 域模型对象应该总是成为有效的(例如, child 的名字不能包含数字)。但是,文本框应显示无效值。在这个非常简单的示例中,ChildrenView
由一个列出ChildViewModels
的DataGrid组成。用户可以在DataGrid的“名称”列中看到无效的名称,但是子对象始终有效。ChildrenView
是一个用户控件:<views:ChildrenView ChildrenAware="{Binding SelectedItem.ChildrenAware, Mode=OneWay}"/>
ChildrenViewModel
在ChildrenView
的资源中创建:<viewModels:ChildrenViewModel x:Key="ViewModel"/>
我的目标:我想测试ObservableCollection(带有类型参数
ChildViewModel
的类型)是否已填充(模拟的)ChildViewModel
对象。问题:为什么执行无参数构造函数,为什么我不能使用构造函数注入(inject)(并注入(inject)可以创建
ChildViewModel
的组件)。问题:我可以看到两种解决方案:使用属性注入(inject)或具有我可以模拟的
StaticClass
类型的set/get属性的IViewModelFactory
:var mockFactory = new Mock<IViewModelFactory>();
mockFactory.Setup(m => m.CreateChildViewModel(mockChild.Object))
.Returns(mockChildViewModel);
StaticClass.ViewModelFactory = mockFactory.Object;
还有其他吗?我应该选择哪一个?
最佳答案
也许我不完全理解您的问题。你为什么不呢?
如果您的ViewModel
像
public class ChildrenViewModel
{
public ChildrenViewModel()
{}
public ChildrenViewModel(IViewModelFactory<IChildViewModel> factory)
{
ChildViewModels = new ObservableCollection<IChildViewModel>(factory.Create());
}
public ObservableCollection<IChildViewModel> ChildViewModels { get; set; }
}
然后虚拟测试可能是
[TestMethod]
public void ChildViewModelsCreatedTest()
{
var factory = new Mock<IViewModelFactory<IChildViewModel>>();
factory.Setup(f => f.Create())
.Returns(new List<IChildViewModel>() { new ChildViewModel() });
var vm = new ChildrenViewModel(factory.Object);
Assert.IsNotNull(vm.ChildViewModels);
Assert.IsTrue(vm.ChildViewModels.Count == 1);
}
关于c# - 如何对WPF用户控件的 View 模型进行单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28724440/