Ich habe eine Anwendung, wo ich System.Threading.Timer verwenden. Wenn der Timer-Rückruf aufgerufen wird, muss ich etwas im UI-Thread tun. Ich benutze MVVMLight DispatcherHelper, um es zu tun. Es funktioniert einwandfrei, wenn ich eine Anwendung ausführe, aber wenn ich es Unit-Test (mit nUnit) testen, ruft der DispatcherHelper die Aktion nicht auf.Einheit testen MVVMLight DispatcherHelper mit Timer funktioniert nicht
es zu demonstrieren, erstelle ich einen einfachen Unit-Test
Timer _Timer; //this is System.Threading.Timer
bool _DispatcherWorks;
[Test]
public async Task MVVMDispatcherTest()
{
DispatcherHelper.Initialize();
Assert.That(DispatcherHelper.UIDispatcher, Is.Not.Null);
_Timer = new Timer(timerCallback, null, 500, 500); //start timer in 0.5 seconds and run every 0.5 seconds
Thread.Sleep(2000); //wait for timer to tick
Assert.That(_DispatcherWorks, Is.True); //will fail
}
private void timerCallback(object state)
{
Console.WriteLine("Timer tick");
Assert.That(DispatcherHelper.UIDispatcher, Is.Not.Null);
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
_DispatcherWorks = true; //this is never called
});
}
Mein Timer 3 Mal ausgeführt wird, was erwartet wird. Die Aktion in DispatcherHelper.CheckBeginInvoikeOnUI wird jedoch nicht aufgerufen. Kann jemand vorschlagen, warum das nicht funktioniert und wie man das testbar macht?