2009-03-10 3 views
0

Je suis en train d'écrire un test unitaire pour couvrir le code trouvé dans notre « dernière chance gestionnaire d'exceptions ».Test Last Chance Exception Handling

Lorsqu'on se réfère à la dernière chance la gestion des exceptions dont je parle gestionnaires d'événements des événements:

Application.ThreadException AppDomain.CurrentDomain.UnhandledException

Plus ou moins je vérifier que les journaux sont produits en détail l'information produite par l'exception. Mon test est similaire à:

[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"); 
} 

Le gestionnaire d'exception est un singleton que lorsque « installé », ajoute simplement aux gestionnaires d'événements donnés précédemment. La chose étrange est que je n'ai pas de résultats cohérents. La rupture et le débogage ne semblent pas être une option car il semble se situer entre l'exception et le gestionnaire d'exception.

Je place plusieurs « Console.WriteLine() » déclarations contenues dans le code pour vérifier où le code a échoué, mais ce n'est pas cohérente. Je crois que cela a quelque chose à voir avec le framework de test qui tue le thread ou peut-être une sorte de garbage collection.

Quelqu'un at-il eu l'expérience de tester un morceau de code comme celui-ci? Ou avez-vous un aperçu de la raison pour laquelle je vois ce genre de comportement?

J'utilise NUnit 2.4 et en cours d'exécution dans l'IDE en utilisant ReSharper.

Répondre

2

Il est une condition de course, votre fil peut pas toujours le temps de faire l'exception + L'exploitation du bois .

Rejoignez le fil, de sorte que vous continuer après la fin du thread.

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

Vous pouvez également définir un délai d'expiration pour l'appel de jointure.

+0

Merci, je vais essayer dès que possible. –

1

Est-il possible que vous essayez de lire la valeur du courant avant que le fil a commencé et terminé?

Pour ce genre de chose que nous allons mettre le flux lu dans une boucle (pseudo-code):

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