WPF MVVM - Модульное тестирование команды - Private vs Public методы? - PullRequest
7 голосов
/ 28 июля 2011

В основном, если я использую MVVM и выставляю публичные ICommands, мои делегаты должны быть публичными или частными?

Ответы [ 3 ]

11 голосов
/ 28 июля 2011

Я бы сделал их приватными - они не являются частью открытого интерфейса вашего класса , для этого предназначены публичные свойства ICommand.

4 голосов
/ 28 июля 2011

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


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

if (CanExecute)
{
    Execute;
}
2 голосов
/ 05 ноября 2012

У меня есть 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

...