Wie kann ich diese Async-Methode testen, die (richtigerweise) eine Ausnahme auslöst?

8

Ich habe die folgende Methode in einer Schnittstelle ..

%Vor%

funktioniert super.

Jetzt versuche ich einen Komponententest zu machen, um zu testen, wenn etwas schief geht - und der Code löst eine Ausnahme aus.

In diesem Fall habe ich meine Methode eingerichtet, um HttpRequestException zu werfen. Mein Komponententest kann nicht sagen, dass ich diese Ausnahme ausgelöst habe.

%Vor%

Die Fehlermeldung vom Komponententest ist

  

Shuldgly.ChuckedAWobbly
  var result = Sollte
          Werfen Sie einen Blick       System.Net.Http.HttpRequestException
          aber nicht

Das Assertion Framework sagt also: Sie haben eine Ausnahme erwartet, aber keine wurde geworfen.

Wenn ich durch den Code gehe, wird die Ausnahme zu 100% ausgelöst.

Kann jemand bitte sehen, was ich mit meinem Unit-Testcode falsch gemacht habe?

    
Pure.Krome 14.03.2014, 10:39
quelle

5 Antworten

11

Das Problem besteht darin, dass Ihr Assertion Framework asynchrone Methoden nicht versteht. Ich empfehle Ihnen, ein Problem mit ihnen anzusprechen.

In der Zwischenzeit können Sie die Quelle für Should.Throw verwenden um dein eigenes MyShould.ThrowAsync zu schreiben:

%Vor%

Und benutze es als solches:

%Vor%

oder das etwas einfachere und äquivalente:

%Vor%     
Stephen Cleary 14.03.2014, 13:48
quelle
3

Das Testen von Async-Code / -Funktionalität ist ziemlich schwierig. Ich bin selbst in der Unit-Test-Async und laufe auf die gleichen Probleme wie Sie.

Ich fand die folgenden zwei Ressourcen sehr hilfreich:

sTodorov 14.03.2014 10:55
quelle
3

Das Problem ist, dass das übergebene Lambda eine Aufgabe zurückgibt. Die geworfene Ausnahme kann nur von Should.Throw beobachtet werden, wenn sie darauf wartet, dass diese Aufgabe abgeschlossen wird, was sie offensichtlich nicht tut. Als Umgehung können Sie .Wait für die von SearchAsync selbst zurückgegebene Aufgabe verwenden.

mstest (das integrierte Visual Studio-Testframework) unterstützt seit Visual Studio 2012 asynchrone Tests. Sie können die Deklaration der Testmethode grundsätzlich ändern, indem Sie "void" durch "async-Task" ersetzen.

%Vor%

Sie verwenden wahrscheinlich ein anderes Unit-Test-Framework, aber es ist nicht klar, welches. Sehen Sie in der Dokumentation nach, ob Async-Tests unterstützt werden.

NUnit 2.6.3 scheint auch Async-Tests zu unterstützen.

edit : Sie verwenden also xUnit. Dieses spezielle Problem wurde für xUnit 2.0 behoben . Es ist derzeit noch Alpha.

    
Wim Coenen 14.03.2014 13:15
quelle
2

Die Ausnahme wird auf einen anderen Thread als den, auf dem der Komponententest ausgeführt wird, angewendet. Das Unit-Test-Framework kann nur Ausnahmen auf seinem eigenen Thread erwarten.

Ich würde vorschlagen, dass Sie die Ausnahme auf einer synchronen Version des Dienstes testen.

    
Chris Ballard 14.03.2014 10:49
quelle
2

Teste es so:

%Vor%

Oder:

%Vor%

Andernfalls wird Ihr Should.Throw zurückgegeben, bevor der async lambda abgeschlossen wurde.

    
avo 14.03.2014 11:11
quelle

Tags und Links