Tengo un código que genera PropertyChanged
eventos y me gustaría poder hacer una prueba unitaria de que los eventos se están generando correctamente.
El código que está generando los eventos es como
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
}
}
}
}
Recibo una buena prueba verde del siguiente código en mis pruebas unitarias, que usa delegados:
[TestMethod]
public void Test_ThatMyEventIsRaised()
{
string actual = null;
MyClass myClass = new MyClass();
myClass.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
actual = e.PropertyName;
};
myClass.MyProperty = "testing";
Assert.IsNotNull(actual);
Assert.AreEqual("MyProperty", actual);
}
Sin embargo, si luego trato de encadenar la configuración de propiedades de la siguiente manera:
public string MyProperty
{
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged("MyProperty");
MyOtherProperty = "SomeValue";
}
}
}
public string MyOtherProperty
{
set
{
if (_myOtherProperty != value)
{
_myOtherProperty = value;
NotifyPropertyChanged("MyOtherProperty");
}
}
}
Mi prueba para el evento falla: el evento que captura es el evento para MyOtherProperty.
Estoy bastante seguro de que el evento se dispara, mi interfaz de usuario reacciona como lo hace, pero mi delegado solo captura el último evento para disparar.
Entonces me pregunto:
1. ¿Es correcto mi método de prueba de eventos?
2. ¿Es correcto mi método de generar eventos encadenados ?
fuente
Si está haciendo TDD, las pruebas de eventos pueden comenzar a generar mucho código repetitivo. Escribí un monitor de eventos que permite un enfoque mucho más limpio para la escritura de pruebas unitarias para estas situaciones.
Por favor vea mi respuesta a lo siguiente para más detalles.
Prueba de unidad de que un evento se genera en C #, utilizando la reflexión
fuente
Esto es muy antiguo y probablemente ni siquiera se leerá, pero con algunas características nuevas de .net, he creado una clase INPC Tracer que permite que:
Ver resumen: https://gist.github.com/Seikilos/6224204
fuente
A continuación se muestra un código de Andrew ligeramente modificado que, en lugar de simplemente registrar la secuencia de eventos generados, cuenta cuántas veces se ha llamado a un evento específico. Aunque está basado en su código, lo encuentro más útil en mis pruebas.
fuente
Basado en este artículo, he creado este simple asistente de afirmación:
Con este método auxiliar, la prueba se vuelve realmente simple.
fuente
No escriba una prueba para cada miembro: esto es mucho trabajo
(tal vez esta solución no sea perfecta para cada situación, pero muestra una forma posible. Es posible que deba adaptarla para su caso de uso)
Es posible usar la reflexión en una biblioteca para probar si todos sus miembros están respondiendo correctamente a su evento de cambio de propiedad:
El siguiente código se puede usar como una biblioteca y muestra cómo probar la siguiente clase genérica
Las pruebas de tu clase ahora se pueden escribir como. (tal vez desee dividir la prueba en "evento está allí" y "evento generado con el nombre correcto"; puede hacerlo usted mismo)
Clase
fuente
He hecho una extensión aquí:
Existe el uso:
fuente