2017-07-03 1 views
0

Ich habe einige Tests, die den Workflow meines WPF-Programms durchlaufen. Ich mache den normalen MVVM-Ansatz, bei dem Schaltflächen in der Ansicht an Befehle im Ansichtsmodell gebunden sind, die dann das Ereignis behandeln. Die Art und Weise, wie meine Tests meinen Workflow testen, erfolgt dann direkt durch Ausführen der Befehle im Ansichtsmodell. Dies übersetzt in etwa etwas wie folgen aussehen:Wie behandelt man Ausnahmen in asynchronen void Methoden mit NUnit

[Test] 
public void Test() 
{ 
    var vm = new ViewModel(); 
    vm.AcceptCommand.Execute(); 
    Assert.IsTrue(stuff); 
} 

All dies funktioniert gut, mit Ausnahme der Tatsache, dass der Code in dem Viewmodel, die den Befehl behandelt endet eine asynchrone void-Methode ist, da dies nur ein Event-Handler wird. Wenn hier eine Ausnahme ausgelöst wird, zeigt Nunit keinen fehlgeschlagenen Test, da diese Ausnahme im Hintergrundthread nicht "gesehen" wird.

Meine Frage ist: Gibt es eine Möglichkeit, NUnit diese Hintergrund Ausnahmen behandeln zu lassen?

Antwort

0

Es gibt ein separates Verfahren in NUnit Ausnahmen in async Methoden zu überprüfen:

var exception = Assert.ThrowsAsync<NotImplementedException>(() => vm.AcceptCommand.Execute()); 

oder umgekehrt:

Assert.DoesNotThrowAsync(() => vm.AcceptCommand.Execute()); 
+0

Dies gilt nicht in meinem Fall arbeiten, da die Event-Handler async ungültig ist, so dass die Ausnahme „entkommt“ den nunit Kontext – ptsoccer

1

Wenn es möglich ist, dann Ihre Methode in zwei Methoden Refactoring. Zuerst sollte man Task zurückgeben, und es ist derjenige, der testbar ist. Der andere sollte anrufen und erwarten erste Methode. Dieser Hinweis stammt aus Concurrency in C# Cookbook von Stephen Cleary. Dies ist die bevorzugte Methode. Dieses Buch erwähnt auch AsyncContext-Klasse von AsyncEx library, die async void Methoden testen können.

AsyncContext.Run(() => 
{ 
    // put your code here 
}) 

Zitat aus dem gleichen Buch: Die AsyncContext Art wartet, bis alle asynchronen Vorgänge abgeschlossen (einschließlich asynchronen Leeren Methoden) und Ausnahmen propagieren werden, dass sie zu erhöhen.

Werfen Sie einen Blick hier für ähnliche Diskussion: Await a Async Void method call for unit testing

+0

In meinem Fall eine andere Methode während des Tests Aufruf ist nicht immer möglich, da viele meiner Tests auf einer höheren Ebene ausgeführt werden und nicht in der Lage sind, eine andere Methode aufzurufen (da dies nicht die sein wird, die die Verbindung herstellt). Ich mag auch nicht die Tatsache, dass dies nicht automatisch ist, da ich (oder jemand anderes, der an dem Projekt arbeitet) daran denken muss, diese spezielle Sache zu tun. Der AsyncContext ist jedoch faszinierend, ich werde untersuchen, dass die nächste Chance, die ich bekomme. – ptsoccer

Verwandte Themen