2009-12-08 6 views
8

Estoy desarrollando aplicaciones WPF usando el patrón MVVM. Tengo modelo de vista con el código como este:Prueba de evento PropertyChanged: ¿es esta una buena manera?

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

OnPropertyChanged es el método virtual de la clase base que acaba de elevar PropertyChanged evento. Quiero probar PropertyChanged evento subir y allí mi método de prueba:

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")); 
    ... 
} 

¿Es una buena manera de probar evento ProprtyChanged?

Respuesta

10

Uso un little Fluent API para hacer exactamente eso. Se le permite escribir pruebas de la siguiente manera:

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

Además de ser sucinta, prefiero este enfoque porque es de tipo seguro - no hay valores de cadena para mantener en sincronía con su API.

Para probar que el evento se está planteando para más de una propiedad, puede simplemente escribir otra prueba que lo haga. Esto le dará muchas pruebas, pero cada una será muy pequeña y evitará Assertion Roulette.

+0

Eso es increíble! Gracias. – bniwredyc

+1

Cosas buenas ... Estaba a punto de escribir mi propio envoltorio, pero pensé que comprobaría primero SO, y voilà ... aquí está> 8) Ajusté ligeramente tu solución para usar xUnit. ¡Gracias! –

1

Creo que es una buena idea probar unitariamente el evento PropertyChanged en el ejemplo que ha mostrado. Es posible que haya escrito la cadena de nombre de propiedad incorrecta que daría como resultado una actualización faltante.

Con la WPF Application Framework (WAF) Es muy fácil escribir una prueba de dicha unidad:

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