2011-07-28 14 views

risposta

11

vorrei fare loro riservata - che non fanno parte della classe public interface della tua classe, ecco a cosa servono le proprietà pubbliche di ICommand.

+0

+1 Verifica l'interfaccia pubblica. –

+0

La mia classe non ha un'interfaccia, è solo una classe. – michael

+3

@michael La collezione di metodi e proprietà 'public' su una classe è considerata" l'interfaccia "della classe, nella misura in cui è così che i consumatori si interfacciano con quella classe. – dlev

4

Personalmente, andrei con metodi privati ​​e ti dirò perché. Stai esponendo uno ICommand, che per me dice che la vista consumante dovrebbe chiamare un CanExecute prima di chiamare un Execute. Se non lo fanno, stanno andando contro l'API e si sparano ai piedi e a quel punto è fuori dalle tue mani. Proprio come se qualcuno avesse usato la reflection per impostare un'importante variabile privata su null e avesse rotto il design della tua classe a causa di questo ... sparandosi ai piedi. Quindi perché rendere privati ​​i membri? Perché non è necessario esporre membri che non dovrebbero essere chiamati direttamente.


Fondamentalmente, quando si unità di prova i membri non farlo singolarmente, lo fa nel modo in cui l'API intende per i membri da eseguire. Quindi, non sei davvero testare i membri, ma soprattutto si sta testando il comando, il che significa ancora una volta dovrebbero essere testati in una coppia in ordine specifico di:

if (CanExecute) 
{ 
    Execute; 
} 
+0

Piuttosto una modifica - o ho appena perso qualcosa ? :) –

+0

@chibacity: A volte tendo a sbraitare. Ho già chiesto qualcosa di simile quando si tratta di test delle unità e qualcuno mi ha detto che se le persone vanno contro l'API, allora è su di loro. Puoi solo andare così lontano a proteggere qualcuno da distruggere una libreria o un'app corretta. –

2

Ho MVVM per qualcosa di semplice controllo di aumento, diminuzione pulsanti e valore di visualizzazione Slider.

Se si dispone di prova ICommand e INotifyPropertyChanged, è possibile effettuare tipo di 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); 
    } 
} 

potete vedere, ho testare il comportamento INotifyPropertyChanged e ICommand esecuzione