【发布时间】:2015-04-27 18:24:12
【问题描述】:
如何模拟ChildViewModels 在ChildrenViewModel 中的创建:
IChildViewModel c = new ChildViewModel(child);
children.Add(c);
我正在使用ChildViewModel(没有ChildView!),因为Child(模型)类没有实现INotifyPropertyChanged。 更新:我引入封装Child 的ChildViewModel 的原因之一是验证要求。 域模型对象应始终有效(例如,孩子的名字不能包含数字)。然而,文本框应该显示无效值。在这个非常简单的示例中,ChildrenView 包含一个列出 ChildViewModels 的 DataGrid。用户可以在 DataGrid“名称”列中看到无效名称,但子对象始终有效。
ChildrenView 是一个用户控件:
<views:ChildrenView ChildrenAware="{Binding SelectedItem.ChildrenAware, Mode=OneWay}"/>
ChildrenViewModel是在ChildrenView的资源中创建的:
<viewModels:ChildrenViewModel x:Key="ViewModel"/>
我的目标:我想测试 ObservableCollection(带有类型参数 ChildViewModel)是否被(模拟)ChildViewModel 对象填充。
问题:无参构造函数被执行为什么我不能使用构造函数注入(并且注入一个可以创建ChildViewModels的组件)。
问题:我可以看到两种解决方案:使用属性注入或 StaticClass,它具有我可以模拟的 IViewModelFactory 类型的 set/get 属性:
var mockFactory = new Mock<IViewModelFactory>();
mockFactory.Setup(m => m.CreateChildViewModel(mockChild.Object))
.Returns(mockChildViewModel);
StaticClass.ViewModelFactory = mockFactory.Object;
还有其他人吗?我应该选择哪一个?
【问题讨论】:
-
你能发布你完整的单元测试吗?很难猜出你要测试什么
-
你没有,因为你没有为你的 UserControls 创建 ViewModels。这是一种代码气味,会导致心碎和失眠。想一想——TextBox 有 TextBoxViewModel 吗?不会。您将 您的 VM 绑定到 TextBox 的公共属性。 UserControls 应该以同样的方式设计。
-
@Will:添加为答案,值得点赞。此外,这样它就可以被搜索到,而且更有用。
-
@lll:我想测试 ObservableCollection(带有类型参数 ChildViewModel)是否正确填充(不执行 ChildViewModel 代码)。
-
@SunnyMilenov 这是一个旁注,而不是这个 OP 有什么问题。关于 OP 因使用 UC VM 而陷入僵局的问题,我得到了许多答案。
标签: c# wpf silverlight mvvm moq