2009-03-10 5 views
0

Ich versuche, einen Komponententest zu schreiben, um Code in unserer "letzten Chance Exception Handler" zu decken.Test Letzte Chance Ausnahmebehandlung

Bei Verweisen auf die letzte Chance Ausnahmebehandlung Ich spreche von Event-Handler der Ereignisse:

Application.ThreadException AppDomain.CurrentDomain.UnhandledException

Mehr oder weniger bin ich überprüfen, ob Protokolle erzeugt werden Detaillierung die von der Ausnahme erzeugten Informationen. Mein Test ist ähnlich:

[Test] 
public void TestMethod() 
{ 
    //Setup log4net ConsoleAppender here 
    //hooking a MemoryStream to the Console.SetOut done here 

    ExceptionHandler.InstallExceptionHandler(); 
    Thread exceptionThread = new Thread(ThrowException); 
    Thread.Start(); 

    //read stream here 

    Assert.That(streamContainsExceptionText); 
} 

private void ThrowException() { 
throw new Exception("Unhandled Exception"); 
} 

Der Exception Handler ist ein Singleton, dass, wenn „Installiert“ nur Handler zu den zuvor gegebenen Ereignisse hinzufügt. Das Seltsame ist, dass ich keine konsistenten Ergebnisse habe. Das Brechen und Debuggen scheint keine Option zu sein, da es zwischen der Ausnahme und dem ExceptionHandler zu liegen scheint.

Ich platziere mehrere "Console.WriteLine()" Anweisungen im gesamten Code, um zu überprüfen, wo der Code fehlgeschlagen ist, aber dies ist nicht konsistent. Ich glaube, es hat etwas damit zu tun, dass der Test Framework den Thread oder möglicherweise eine Art Garbage-Collection löscht.

Hat jemand Erfahrung damit gehabt, ein Stück Code wie diesen zu testen? Oder haben Sie einen Einblick, warum ich diese Art von Verhalten sehe?

Ich benutze NUnit 2.4 und läuft es in der IDE mit ReSharper.

Antwort

2

Es ist eine Race-Bedingung, könnte Ihr Gewinde haben nicht immer die Zeit, um die Ausnahme + zu tun es Protokollierung .

Verbinden Sie den Thread, so dass Sie fortfahren, nachdem der Thread beendet ist.

Thread exceptionThread = new Thread(ThrowException); 
    exceptionThread.Start(); 
    exceptionThread.Join(); 
    //read stream, and rest of the test 

Auch möchten Sie möglicherweise eine Zeitüberschreitung für den Anruf beitreten.

+0

Danke, ich werde das versuchen, sobald ich kann. –

1

Ist es möglich, dass Sie versuchen, den Wert aus dem Stream zu lesen, bevor der Thread gestartet und dann beendet wurde?

Für diese Art der Sache werden wir den Strom in einer Schleife (Pseudo-Code) lesen put:

while (!timed out) { 
    read from stream; 
    if (message is in stream) { 
     set success flag; 
     break; 
    } 
    sleep; 
} 
if (!success flag) { 
    throw test failure; 
}