单元测试MVVM命令

时间:2014-11-20 09:36:52

标签: wpf unit-testing mvvm icommand

我有一个新的WPF MVVM项目,并希望为我的ViewModel编写“一些有用的”单元测试。

我的ViewModel类:

public class ConsignorViewModel : ViewModel
{
    ...
    #region Commands
    void NewModel()
    {
        _model = new Consignor();

        RaisePropertyChanged(String.Empty, validatePropertyName: false);
    }
    void SaveModel()
    {
        ... //some logic to save
    }

    public override ICommand New { get { return new RelayCommand(NewModel); } }
    public override ICommand Save { get { return new RelayCommand(SaveModel); } }
    #endregion
}

我想对这些命令进行单元测试。这样做的最佳方式是什么?

目前,我的单元测试方法看起来像这样:

[TestMethod]
public void TestCommands()
{
    //Arrange

    //Act

    //Assert
    ////New Command
    Assert.IsNotNull(_consignorViewModel.New);
    Assert.IsTrue(_consignorViewModel.New is RelayCommand);

    ////Save Command
    Assert.IsNotNull(_consignorViewModel.Save);
    Assert.IsTrue(_consignorViewModel.Save is RelayCommand);
}

我想测试命令的行为/结果。 在测试“new”命令时,我想确保模型是“重置”(构造函数调用)。目前这是不可能的,因为我的方法“NewModel”和“SaveModel”在单元测试中不可见,这是正确的,因为它们不是公共接口的一部分。所以我不想让它们公开......

1 个答案:

答案 0 :(得分:0)

  

目前这不可能作为我的方法" NewModel"和" SaveModel"在单元测试中不可见,因为它们不属于公共接口。

他们不应该。你已经知道了这个问题的解决方案,你甚至自己说过:

  

我想测试命令的行为/结果。

这就是重点。通过单元测试,我们验证可观察效果。用户如何识别模型已重置?用户不了解New方法,也不应该进行单元测试。如果New方法没有可观察到的副作用,从公共POV可见,那么您也可以从代码库中删除它。

确定那些公开可见的更改并对其进行测试。