2011-07-28 3 views

ответ

11

Я бы их частные - они не являются частью вашего класса public interface, вот для чего предназначены общедоступные объекты ICommand.

+0

+1 Проверьте открытый интерфейс. –

+0

У моего класса нет интерфейса, хотя это просто класс. – michael

+3

@michael. Коллекция 'public' методов и свойств в классе считается интерфейсом этого класса, поскольку это то, как пользователи взаимодействуют с этим классом. – dlev

4

Лично я бы пошел с частными методами, и я скажу вам, почему. Вы показываете ICommand, который мне говорит, что потребительский вид должен вызывать CanExecute до вызова Execute. Если они этого не сделают, они идут против API и стреляют в ногу, и в этот момент это не в ваших руках. Точно так же, как если бы кто-то использовал отражение, чтобы установить важную частную переменную в нуль и сломал ваш дизайн класса из-за этого ... стрелял в ногу. Итак, зачем делать членов закрытыми? Потому что нет необходимости выставлять членов, которые не следует вызывать напрямую.


В основном, когда вы модульное тестирование членов не делать так индивидуальна, вы делаете это в том, как API предназначается для пользователей, которые будут выполнены. Таким образом, вы не тестируете членов, но к тому же вы тестируете команду, которая снова означает, что они должны быть протестированы в паре в определенном порядке:

if (CanExecute) 
{ 
    Execute; 
} 
+0

Довольно правку - или я просто что-то пропустил ? :) –

+0

@chibacity: Иногда я склонен говорить. Я спросил что-то подобное раньше, когда дело доходит до модульного тестирования, и кто-то сказал мне, что если люди идут против API, то это на них. Вы можете только зайти так далеко, чтобы защитить кого-то от уничтожения соответствующей библиотеки или приложения. –

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 выполняющегося

Смежные вопросы