c# wpf unit-testing mvvm icommand

c# - WPF MVVM-Unidad de prueba de un comando-Privado vs métodos públicos?



unit-testing icommand (3)

Los haría privados; no son parte de la interfaz pública de su clase, para eso son las propiedades públicas de ICommand.

Básicamente, si uso MVVM y expongo ICommands públicos, ¿deberían mis delegados ser públicos o privados?


Personalmente, elegiría métodos privados y te diré por qué. Estás exponiendo un ICommand , que para mí dice que la vista de consumo debería llamar a CanExecute antes de llamar a Execute. Si no lo hacen, irán contra la API y se dispararán a sí mismos en el pie y en ese punto está fuera de sus manos. Al igual que si alguien usara la reflexión para establecer una variable privada importante como nula y rompiera el diseño de su clase debido a esto ... disparándose en el pie. Entonces, ¿por qué hacer que los miembros sean privados? Porque no hay necesidad de exponer a los miembros que no deberían ser llamados directamente.

Básicamente, cuando prueba los miembros que no lo hace individualmente, lo hace de la forma en que la API pretende que los miembros se ejecuten. Por lo tanto, no está realmente probando los miembros, pero además está probando el comando, lo que significa que deben probarse en un par en el orden específico de:

if (CanExecute) { Execute; }


Tengo MVVM para algo simple de control de aumento, disminución de botones y Slider show value.

Si tiene la prueba ICommand e INotifyPropertyChanged, puede hacer una especie de 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); } }

puedes ver, pruebo el comportamiento de INotifyPropertyChanged y la ejecución de ICommand