Tengo un UserControl
que publica un mensaje EventAggregator
en su evento Loaded
. Para probar esto (y obtener el evento Loaded
planteado), actualmente estoy creando una ventana y agregando el control a ella, esperando a que se genere el evento Loaded
.Probando el control WPF sin agregarlo a una ventana
¿Hay alguna manera de configurar una prueba para que el evento Loaded
se dispare sin tener que crear y agregar el control a una ventana?
Por ejemplo:
[Test, RequiresSTA]
public void active_thingy_message_is_published_on_loaded()
{
const string TestMsg = "Active thingy changed";
using (AutoResetEvent loadedEvent = new AutoResetEvent(false))
{
DummyEventService eventService = new DummyEventService();
DummyControl control = new DummyControl(eventService, TestMsg);
control.Loaded += delegate { loadedEvent.Set(); };
Assert.That(eventService.Message, Is.Null, "Before.");
Window window = new Window { Content = control };
window.Show();
loadedEvent.WaitOne();
window.Dispatcher.InvokeShutdown();
Assert.That(eventService.Message, Is.EqualTo(TestMsg), "After.");
}
}
private class DummyControl : UserControl
{
public DummyControl(DummyEventService eventService, string testMsg)
{
Loaded += delegate { eventService.Publish(testMsg); };
}
}
private class DummyEventService
{
public string Message { get; private set; }
public void Publish(string msg) { Message = msg; }
}
actualización
he cambiado el título de "pruebas unitarias ..." a "Testing ...", y se sustituye la etiqueta "unidad- prueba "con" prueba ".
Preferiría no dividir los pelos sobre exactamente qué clase de prueba es esta, ya que no es constructiva. Sí, se podría argumentar que esto no es una "Prueba de unidad", pero eso no es útil. Quiero probar un problema que depende del ciclo de vida del control y esto implica el evento Loaded
. Es una prueba de regresión importante, ya que los componentes de terceros que no tengo control dependen del mensaje que se plantea al Loaded
.
¿Se puede generar el evento Loaded
sin agregar el control a una ventana?
Tendrá que fingir/burlarse de la ventana ... Pero esto ya no parece una prueba unitaria. –
@Henk ¿Cómo ves una ventana falsa que hace que se cargue mi control de usuario y, por lo tanto, desencadena su evento 'Loaded'? –
Usted podría intentar provocar el evento de carga a través de la reflexión: http://stackoverflow.com/questions/198543/how-do-i-raise-an-event-via-reflection-in-net-c –