WPF MVVM - Модульное тестирование команды - Private vs Public методы?
По сути, если я использую MVVM и выставляю публичные ICommands, мои делегаты должны быть публичными или частными?
3 ответа
Я бы сделал их приватными - они не являются частью открытого интерфейса вашего класса, для этого и нужны публичные свойства ICommand.
Лично я бы пошел с частными методами, и я скажу вам, почему. Вы выставляете ICommand
что мне говорит, что представление потребления должно вызвать CanExecute до вызова Execute. Если они этого не делают, они идут против API и стреляют себе в ногу, и в этот момент это не в ваших руках. Точно так же, как если бы кто-то использовал рефлексию для установки важной закрытой переменной на нуль и нарушил дизайн вашего класса из-за этого... стрелял себе в ноги. Так зачем делать членов приватными? Потому что нет необходимости выставлять участников, которые не должны вызываться напрямую.
По сути, когда вы тестируете элементы по отдельности, вы не делаете это по отдельности, вы делаете это так, как API предназначен для выполнения элементов. Таким образом, вы на самом деле не тестируете члены, но, кроме того, вы тестируете команду, что снова означает, что они должны тестироваться в паре в определенном порядке:
if (CanExecute)
{
Execute;
}
У меня есть 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