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.
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?
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:
Und benutze es als solches:
%Vor%oder das etwas einfachere und äquivalente:
%Vor%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:
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.
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.
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.
Tags und Links .net c# unit-testing async-await