2009-12-08 4 views
8

Sto sviluppando applicazioni WPF utilizzando il pattern MVVM. Ho ViewModel con codice come questo:Test degli eventi PropertyChanged: è un buon modo?

public bool EditModeEnabled 
{ 
    get { return _EditModeEnabled; } 
    set 
    { 
     _ModeEditModeEnabled = value; 
     OnPropertyChanged("EditModeEnabled"); 
     OnPropertyChanged("CommentTextBoxVisibility"); 
    } 
} 

OnPropertyChanged è il metodo virtuale della classe base che ha appena alzare PropertyChanged evento. Voglio testare PropertyChanged evento alzando e c'è il mio metodo di prova:

public void EditModeEnabledTest() 
{ 
    var imageViewModel = TestHelper.GetTestImageViewModel(); 
    var firedEvents = new List<string>(); 
    imageViewModel.PropertyChanged += ((sender, e) => firedEvents.Add(e.PropertyName)); 
    imageViewModel.Mode = true; 
    Assert.AreEqual(firedEvents.Count, 2); 
    Assert.IsTrue(firedEvents.Contains("EditModeEnabled")); 
    Assert.IsTrue(firedEvents.Contains("CommentTextBoxVisibility")); 
    ... 
} 

E 'un buon modo per testare evento ProprtyChanged?

risposta

10

Io uso un little Fluent API per fare esattamente questo. Esso consente di scrivere i test in questo modo:

var imageViewModel = TestHelper.GetTestImageViewModel(); 
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled) 
    When(s => s.Mode = true); 

Oltre ad essere succinta, preferisco questo approccio perché è il tipo di sicurezza - non valori di stringa per mantenere in sincronia con la vostra API.

Per verificare che l'evento venga generato per più di una proprietà, è sufficiente scrivere un altro test che lo faccia. Questo ti darà molti test, ma ognuno sarà molto piccolo ed eviterà Assertion Roulette.

+0

Questo è impressionante! Grazie. – bniwredyc

+1

Roba buona ... stavo per scrivere il mio wrapper, ma ho pensato di controllare SO, e voilà ... eccolo qui> 8) Ho ottimizzato leggermente la tua soluzione per usare xUnit. Grazie! –

1

Credo che sia una buona idea testare l'evento PropertyChanged nell'esempio che hai mostrato. È possibile che sia stata scritta la stringa nome proprietà errata che avrebbe provocato un aggiornamento mancante.

Con la WPF Application Framework (WAF) E 'molto facile scrivere una tale prova di unità:

Person person = new Person(); 
AssertHelper.PropertyChangedEvent(person, x => x.Name,() => person.Name = "Luke");