基本上,如果我使用MVVM并公开公共ICommands,我的代表应该公开还是私有?
答案 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执行