2011-07-28 60 views

回答

11

我会让他们私人的 - 他们不属于您班级的public interface,这是公共ICommand属性的用途。

+0

+1测试公共接口。 –

+0

虽然我的班级没有界面,但它只是一个班级。 – michael

+3

@michael类的“公共”方法和属性的集合被认为是类的“接口”,因为这是消费者与该类接口的接口。 – dlev

4

就我个人而言,我会用私人方法去,我会告诉你为什么。你正在公开一个ICommand,对我而言,消费视图应该在调用Execute之前调用CanExecute。如果他们不这样做,他们会反对API并在脚下射击自己,那时它已经失去了你的手。就好像有人用反射来设置一个重要的私有变量,从而导致你的课堂设计无效并因此而崩溃......在脚下自我射击。那么为什么要让这些成员保密?因为不需要公开那些不应该直接调用的成员。


基本上,当你进行单元测试,你不这样做单独的成员,您在API打算要执行成员的方式这样做。所以,你没有真正测试成员,但另外你正在测试的命令,这又意味着他们应该在一对的特定顺序来进行测试:

if (CanExecute) 
{ 
    Execute; 
} 
+0

相当的编辑 - 还是我只是想念的东西? :) –

+0

@chibacity:有时我倾向于咆哮。我之前曾经提过类似单元测试的问题,并且有人告诉我,如果人们违背API,那么就是这样。你只能走得这么远才能保护某人免于摧毁一个合适的图书馆或应用程序。 –

2

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

如果你有测试的ICommand和INotifyPropertyChanged的,你可以做单元测试的类型:

[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的执行