2013-08-14 3 views
13

Ich habe einen Test, der eine externe Assembly verwendet, um auf UI-Funktionen in der Anwendung zuzugreifen, die wir testen. Diese Assembly gibt eine Ausnahme ihres eigenen benutzerdefinierten Typs aus, wenn sich die Benutzeroberfläche nicht im entsprechenden Status befindet.MsTest TestCleanup-Methode wird nicht aufgerufen, wenn eine unbehandelte Ausnahme ausgelöst wird

Ich habe eine TestCleanup-Methode eingerichtet, die den Prozess der Anwendung beendet (während ein TestInitialize gestartet wird), sodass die Benutzeroberfläche nach Abschluss eines Testlaufs mit einem sauberen Status neu gestartet wird.

Dies funktioniert gut unter normalen Bedingungen, aber immer wenn eine Ausnahme von der referenzierten Assembly geworfen wird, kommt es nie zur Aufräummethode und springt direkt zum nächsten Test. Dies geschieht nicht mit Ausnahmen, die vom Test selbst ausgelöst werden, wie AssertFailedException. Ich habe sogar versucht, eine grundlegende Ausnahme vom Test zu werfen, und es kam zur Säuberungsmethode.

+0

Welche Art von Ausnahme wird ausgelöst? Wenn du es versuchst es zu fangen, fängst du es an? Ist es wirklich eine Ausnahme oder ein harter Unfall? Versuchen Sie, ein reproduzierbares Szenario zu erstellen, das hier veröffentlicht werden kann. –

+0

Es handelt sich um eine benutzerdefinierte Ausnahme, die in der externen Assembly implementiert ist und direkt von Exception geerbt wird. Es ist eine echte, einfache .net-Ausnahme, kein harter Crash oder irgendetwas dergleichen. Und ja, ein Try-Catch-Block würde es fangen - aber das bedeutet, ich muss jeden Test damit umgeben und Assert aufrufen. Fail on catch. Allerdings, wie ich in meinem ursprünglichen Beitrag erwähnt, wenn ich eine System.Exception aus dem ** Test selbst ** werfen, wird MSTest nicht abstürzen und wird die Bereinigungsmethode wie erforderlich treffen. –

+0

Können Sie es mit Ihrem eigenen Code reprobieren? Ich habe versucht und konnte das Szenario, in dem die Bereinigung nicht ausgeführt wurde, nicht erneut erstellen. –

Antwort

0

Diese von der Art und Weise C# weicht leider Ausnahmen in Konstrukteuren behandelt: Wenn dies geschieht, wird der Finalizer aufgerufen.