2009-03-10 2 views
0

"마지막 기회 예외 처리"에서 발견 된 코드를 다루기 위해 단위 테스트를 작성하려고합니다.마지막 기회 예외 처리 테스트

내가 이벤트의 이벤트 핸들러에 대해 이야기하고 마지막 기회 예외 처리 참조 :

Application.ThreadException AppDomain.CurrentDomain.UnhandledException

더 이하 나는 로그를 자세히 생산되고 있는지 확인하고 예외에 의해 생성 된 정보

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

예외 처리기는 "설치된"때 바로 이전에 주어진 이벤트에 핸들러를 추가하는 싱글은 다음과 같습니다에 내 테스트는 비슷합니다. 이상한 점은 일관된 결과가 없다는 것입니다. 깨지기와 디버깅은 예외와 ExceptionHandler 사이에 들어가기 때문에 옵션으로 보이지 않습니다.

코드 전체에 여러 개의 "Console.WriteLine()"문을 사용하여 코드가 실패한 곳을 확인하지만 일관성이 없습니다. 나는 그것이 스레드를 죽이는 프레임 워크 또는 가능한 일종의 가비지 콜렉션과 관련이 있다고 생각한다.

누구나 이런 코드를 테스트 해 본 경험이 있습니까? 아니면 내가 이런 종류의 행동을하는 이유에 대한 통찰력이 있습니까?

저는 NUnit 2.4를 사용하고 있으며 ReSharper를 사용하여 IDE에서 실행 중입니다.

답변

2

그것은 경쟁 조건이며, 스레드는 항상 로깅 예외 +를 할 시간이 없을 수도 있습니다 .

스레드에 가입하면 스레드가 완료된 후에 계속 진행됩니다.

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

또한 참여 통화에 시간 초과를 설정할 수 있습니다.

+0

감사합니다. 최대한 빨리 시도하겠습니다. –

1

스레드가 시작한 후 끝내기 전에 스트림에서 값을 읽는 중입니까? 우리는 스트림 루프 내부에 읽어 둘 것이다 이런 종류의 (의사)의 경우

:

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