WPF MVVM - 单元测试命令 - 私有vs公共方法?

时间:2011-07-28 18:58:39

标签: c# wpf unit-testing mvvm icommand

基本上,如果我使用MVVM并公开公共ICommands,我的代表应该公开还是私有?

3 个答案:

答案 0 :(得分:11)

我会将它们设为私有 - 它们不属于您的班级public interface,这就是公共ICommand属性的用途。

答案 1 :(得分:4)

就个人而言,我会采用私人方式,我会告诉你原因。您正在公开ICommand,对我来说,消费视图应该在调用Execute之前调用CanExecute。如果他们不这样做,他们就会违反API并在脚下射击自己,那时它就不在你的手中了。就像有人使用反射将一个重要的私有变量设置为null并因此而破坏了你的类设计......在脚下射击自己。为什么要让会员私密?因为不需要公开不应该直接调用的成员。


基本上,当您单独测试成员时,不是单独执行,而是按照API打算执行成员的方式进行。所以,你并没有真正测试成员,而且你正在测试命令,这也意味着他们应该按照特定的顺序进行成对测试:

if (CanExecute)
{
    Execute;
}

答案 2 :(得分:2)

我有MVVM用于简单控制增加,减少按钮和滑块显示值。

如果您有测试ICommand和INotifyPropertyChanged,您可以进行UnitTest:

[TestMethod]
public void TestViewModel3()
{
    int min = -10;
    int max = 10000;
    int initVal = 50;
    bool initState = false;

    ToglledSliderModel model = new ToglledSliderModel(initState, initVal, min, max);
    ToglledSliderViewModel viewModel = new ToglledSliderViewModel();
    viewModel.Model = model;

    int status = 567;
    viewModel.PropertyChanged += delegate
    {
        status = 234;
    };

    for (int i = 1; i < 100; i++)
    {
        status = 567;
        ICommand ic = viewModel.IncreaseValue;
        ic.Execute(this);
        Thread.Sleep(2);
        Assert.AreEqual(status, 234);
        Assert.AreEqual(model.SliderValue, initVal + i);
    }
}

你可以看到,我测试了INotifyPropertyChanged行为和ICommand执行