基本上,如果我使用 MVVM 并公开公共 ICommand,我的代表应该是公共的还是私有的?
问问题
8091 次
3 回答
11
我会将它们设为私有 - 它们不是您类的公共接口的一部分,这就是公共 ICommand 属性的用途。
于 2011-07-28T18:59:58.777 回答
4
就个人而言,我会使用私有方法,我会告诉你原因。你暴露了一个ICommand
,对我来说,消费视图应该在调用 Execute 之前调用 CanExecute。如果他们不这样做,他们就会违背 API 并在自己的脚下开枪,到那时它就超出了你的控制范围。就像有人使用反射将一个重要的私有变量设置为 null 并因此破坏了你的类设计...... 那么为什么要将成员设为私有呢?因为不需要暴露不应该直接调用的成员。
基本上,当您对成员进行单元测试时,您不会单独执行此操作,而是按照 API 打算让成员执行的方式执行此操作。因此,您并没有真正测试成员,而且您正在测试命令,这再次意味着它们应该按照以下特定顺序成对测试:
if (CanExecute)
{
Execute;
}
于 2011-07-28T18:59:54.800 回答
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 执行
于 2012-11-05T13:28:08.900 回答