如何对WPF用户控件的视图模型进行单元测试

时间:2015-02-25 16:33:16

标签: c# wpf silverlight mvvm moq

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

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

我正在使用ChildViewModel没有ChildView),因为Child(模型)类没有实现INotifyPropertyChanged更新:我介绍ChildViewModel封装Child的原因之一是验证要求。 域模型对象应始终 有效(例如,孩子的名字不得包含数字)。但是,文本框应显示无效值。在这个非常简单的示例中,ChildrenView由列出ChildViewModels的DataGrid组成。用户可以在DataGrid“name”列中看到无效名称,但子对象始终有效。

ChildrenView是一个用户控件:

<views:ChildrenView ChildrenAware="{Binding SelectedItem.ChildrenAware, Mode=OneWay}"/>

ChildrenViewModel是在ChildrenView

的资源中创建的
<viewModels:ChildrenViewModel x:Key="ViewModel"/>

我的目标:我想测试ObservableCollection(类型参数为ChildViewModel)是否填充了(模拟的)ChildViewModel个对象。

问题:执行无参数构造函数为什么我不能使用构造函数注入(并注入一个可以创建ChildViewModel s的组件)。

问题:我可以看到两个解决方案:使用属性注入或StaticClass具有类型为IViewModelFactory的set / get属性,我可以模拟:

var mockFactory = new Mock<IViewModelFactory>();
mockFactory.Setup(m => m.CreateChildViewModel(mockChild.Object))
           .Returns(mockChildViewModel);

StaticClass.ViewModelFactory = mockFactory.Object;

还有其他人吗?我应该选择哪一个?

1 个答案:

答案 0 :(得分:0)

  

问题:执行无参数构造函数的原因我无法使用   构造函数注入(并注入可以创建的组件)   ChildViewModels)。

也许我并不完全理解你的问题。为什么不是你?

如果您的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);
}