2012-03-14 16 views
5

soy un "principiante" en TDD, y algo que estoy tratando de averiguar es la forma de unidad de prueba ViewModels ...Prueba ViewModel PropertyChanged Eventos

Estoy queriendo asegurarse de que un evento de la propiedad ProeprtyChanged se dispara. .. Tengo la siguiente prueba usando nunit.

[Test]   
public void Radius_Property_Changed() 
{ 
    var result = false; 
    var sut = new MainViewModel(); 
    sut.PropertyChanged += (s, e) => 
    { 
     if (e.PropertyName == "Radius") 
     { 
      result = true; 
     } 
    }; 

    sut.Radius = decimal.MaxValue; 
    Assert.That(result, Is.EqualTo(true)); 
} 

¿Es esta la manera más limpia de hacer esto, o hay una mejor manera de probar esta propiedad

... fragmento de código en el modelo de vista de la Propety me parece a esta prueba ..

public decimal Radius 
{ 
    get { return _radius; } 
    set 
    { 
     _radius = value; 
     OnPropertyChanged("Radius"); 
    } 
} 

Respuesta

4

Esto es más o menos cómo lo haces. No hay mucho más que hacer aquí dado que es un código bastante simple (y aburrido). Puede valer la pena incluir eso en su propia biblioteca/herramienta reutilizable. O mejor aún, use existing code.

+0

He refactorizado que utilice [TestCase] ​​y lo hizo más genérico ... gracias por la sugerencia –

1

Mi propia prueba "mínima" para este tipo de cosas es ligeramente diferente. En lugar de verificar que el evento se haya suscitado, generalmente verificaría que se haya elevado al exactamente una vez. marco de pruebas

+0

Buen punto - algo que vale la pena considerar –

1

de granito le permite escribir pruebas de la siguiente manera:

[TestMethod] 
    public void ChangeTrackingModelBase_BasicFunctionalityTest() 
    { 
     var person = new ChangeTrackingPerson(); 
     var eventAssert = new PropertyChangedEventAssert(person); 

     Assert.IsNull(person.FirstName); 
     Assert.AreEqual("", person.LastName); 

     eventAssert.ExpectNothing(); 

     person.FirstName = "John"; 

     eventAssert.Expect("FirstName"); 
     eventAssert.Expect("IsChanged"); 
     eventAssert.Expect("FullName"); 

     person.LastName = "Doe"; 

     eventAssert.Expect("LastName"); 
     eventAssert.Expect("FullName"); 

     person.InvokeGoodPropertyMessage(); 
     eventAssert.Expect("FullName"); 

     person.InvokeAllPropertyMessage(); 
     eventAssert.Expect(""); 

    } 

http://granite.codeplex.com/SourceControl/list/changesets

Se basa en MSTest, pero fácilmente podría volver a escribir para que funcione con NUnit.

+0

Gracias, voy a revisar Granito - este se parece más a una prueba de integración para mí, pero definitivamente algo que me gustaría cubrir –

+0

¿Prueba de integración? No, no está hablando con ningún servicio externo o base de datos. –

0

he tomado una clase simple que se puede utilizar para esto: github

Se utiliza la reflexión para determin si un evento cambiado la propiedad fue levantado cuando el valor se establece de una propiedad pública.

Ejemplo:


[TestMethod] 
public void Properties_WhenSet_TriggerNotifyPropertyChanged() 
{ 
    new NotifyPropertyChangedTester(new FooViewModel()).Test(); 
} 
Cuestiones relacionadas