2009-03-10 24 views
0

"Son şans istisnası işleyicimizde" bulunan kodu kapatmak için bir birim testi yazmaya çalışıyorum.Son Şans Kural Dışı Durum İşleme Sınaması

Ben olayların olay işleyicileri bahsediyorum son şans istisna işleme atıfta:

Application.ThreadException AppDomain.CurrentDomain.UnhandledException

Az ya ben günlükleri ayrıntılarıyla üretilen geçirildiğini teyit ediyorum istisna tarafından üretilen bilgiler.

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

İstisna Handler "Yüklü" zaman sadece önceden verilen olaylara işleyicileri ekler bir tekil geçerli: Benim Test benzer. Tuhaf olan şey, tutarlı sonuçlara sahip olmamam. Ayrılma ve hata ayıklama bir seçenek olarak görünmüyor, çünkü istisna ile ExceptionHandler arasına giriyor gibi görünüyor.

Kodun başarısız olduğunu doğrulamak için kodun tamamında birkaç "Console.WriteLine()" ifadesi yerleştirdim ancak bu tutarlı değil. Bu testin, ipliği öldürme ya da muhtemelen bir çeşit çöp toplama işlemiyle ilgili bir şeye sahip olduğuna inanıyorum.

Böyle bir kod parçasını test eden herhangi biri deneyime sahip oldu mu? Yoksa bu tür davranışları neden gördüğümle ilgili bir fikrin var mı?

NUnit 2.4 kullanıyorum ve ReSharper kullanarak IDE'de çalıştırıyorum.

cevap

2

Bu bir yarış durumdur, senin parçacığı her zaman günlüğü istisna + yapmak için zaman olmayabilir .

İş parçacığına katılın, böylece iş parçacığı bittikten sonra devam edersiniz. Ayrıca, Çağrıya katılma zaman aşımı yapmak da isteyebilirsiniz.

+0

Teşekkürler, elimden geldiğince bunu deneyeceğim. –

1

İş parçacığı başlatılmadan önce akıştan değeri okumaya çalıştığınız ve daha sonra bitirdiğiniz mümkün mü? Biz akışı içinde bir döngü okumak koymak olacak şey bu tür (yalancı kod) için

:

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