如何在ChildViewModel中模拟ChildrenViewModel的创建:

IChildViewModel c = new ChildViewModel(child);
children.Add(c);

我正在使用ChildViewModel(没有ChildView!),因为Child(模型)类未实现INotifyPropertyChanged更新:我引入封装ChildViewModelChild的原因之一是验证要求。 域模型对象应该总是成为有效的(例如, child 的名字不能包含数字)。但是,文本框应显示无效值。在这个非常简单的示例中,ChildrenView由一个列出ChildViewModels的DataGrid组成。用户可以在DataGrid的“名称”列中看到无效的名称,但是子对象始终有效。
ChildrenView是一个用户控件:
<views:ChildrenView ChildrenAware="{Binding SelectedItem.ChildrenAware, Mode=OneWay}"/>
ChildrenViewModelChildrenView的资源中创建:
<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/

10-10 18:48