В принципе, если я использую MVVM и выставляю общедоступные ICommands, должны ли мои делегаты быть публичными или частными?WPF MVVM - модуль Тестирование команды - частные и общедоступные методы?
ответ
Я бы их частные - они не являются частью вашего класса public interface, вот для чего предназначены общедоступные объекты ICommand.
Лично я бы пошел с частными методами, и я скажу вам, почему. Вы показываете ICommand
, который мне говорит, что потребительский вид должен вызывать CanExecute до вызова Execute. Если они этого не сделают, они идут против API и стреляют в ногу, и в этот момент это не в ваших руках. Точно так же, как если бы кто-то использовал отражение, чтобы установить важную частную переменную в нуль и сломал ваш дизайн класса из-за этого ... стрелял в ногу. Итак, зачем делать членов закрытыми? Потому что нет необходимости выставлять членов, которые не следует вызывать напрямую.
В основном, когда вы модульное тестирование членов не делать так индивидуальна, вы делаете это в том, как API предназначается для пользователей, которые будут выполнены. Таким образом, вы не тестируете членов, но к тому же вы тестируете команду, которая снова означает, что они должны быть протестированы в паре в определенном порядке:
if (CanExecute)
{
Execute;
}
Довольно правку - или я просто что-то пропустил ? :) –
@chibacity: Иногда я склонен говорить. Я спросил что-то подобное раньше, когда дело доходит до модульного тестирования, и кто-то сказал мне, что если люди идут против API, то это на них. Вы можете только зайти так далеко, чтобы защитить кого-то от уничтожения соответствующей библиотеки или приложения. –
У меня есть 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 выполняющегося
+1 Проверьте открытый интерфейс. –
У моего класса нет интерфейса, хотя это просто класс. – michael
@michael. Коллекция 'public' методов и свойств в классе считается интерфейсом этого класса, поскольку это то, как пользователи взаимодействуют с этим классом. – dlev