Ho un UserControl
che pubblica un messaggio EventAggregator
nel suo evento Loaded
. Per testarlo (e ottenere l'evento Loaded
) sto creando una finestra e aggiungendo il controllo ad esso, quindi sto aspettando che venga sollevato l'evento Loaded
.Test del controllo WPF senza aggiungerlo a una finestra
C'è un modo per impostare un test in modo che l'evento Loaded
si attivi senza dover creare e aggiungere il controllo a una finestra?
Ad esempio:
[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; }
}
Aggiornamento
ho cambiato il titolo da "Unit Testing ..." a "Testing ...", e ha sostituito il tag "unit test "con" test ".
preferirei non spaccare il capello sopra esattamente quale classe di prova di questo è, in quanto non è costruttivo. Sì, si potrebbe sostenere che questo non è un "Test unitario", ma non è utile. Voglio testare un problema che dipende dal ciclo di vita del controllo e questo comporta l'evento Loaded
. È un test di regressione importante, in quanto i componenti di terze parti di cui non ho il controllo dipendono dal fatto che il messaggio venga generato a Loaded
.
Può caso Loaded
essere sollevato senza aggiungere il controllo a una finestra?
Dovrai simulare/falsificare la finestra ... Ma questo non sembra più il test unitario. –
@Henk Come vedi una finta finestra che causa il caricamento del mio controllo utente, quindi attiva il suo evento 'Loaded'? –
Si potrebbe provare ad aumentare l'evento Load attraverso la riflessione: http://stackoverflow.com/questions/198543/how-do-i-raise-an-event-via-reflection-in-net-c –