2014-06-13 2 views
0

확장 메서드가 있습니다. 여기있다 :이를 테스트하려면비 결정적 다중 스레드 테스트

public static void BeginInvokeWithAutoEnd(this EventHandler handler, object sender, EventArgs eventArgs) 
{ 
    var buffer = handler; 
    buffer.BeginInvoke(sender, eventArgs, buffer.EndInvoke, null); 
} 

는 다음과 같은 방법이있다 : 자체가 잘 작동

[TestMethod] 
public void BeginInvokeWithAutoEnd_SubscribedMethodThrowsException_ExceptionCanBeCaught() 
{ 
    var multiThreadTest = new MultiThreadTest(2);//Class that helps to test asynchronous stuff 
    var thrown = false; 
    var ex = new Exception("OOoooOOo!"); 
    EventHandler onHandler = (s, a) => { throw ex; }; 
    UnhandledExceptionEventHandler currentDomainOnUnhandledException = (s, args) => 
    { 
     thrown = args.ExceptionObject.Equals(ex); 
     multiThreadTest.Notify(); 
    }; 
    AppDomain.CurrentDomain.UnhandledException += currentDomainOnUnhandledException; 

    //Invokes Action from the parameter and waits for multiThreadTest.Notify(); method to be called, otherwise 2 seconds 
    multiThreadTest.Act(() => onHandler.BeginInvokeWithAutoEnd(this, EventArgs.Empty)); 

    AppDomain.CurrentDomain.UnhandledException -= currentDomainOnUnhandledException; 
    Assert.IsTrue(thrown); 
} 

테스트,하지만 무작위로 내가 가진 다른 테스트 중 하나 나옵니다. 내가 부러진 테스트를 볼 때 그것은 쓰여진다 : The agent process was stopped while the test was running.. 즉, 깨진 테스트가 실행되는 동안 다른 스레드에서 처리되지 않은 예외가 있음을 의미합니다.

나는 어떻게 이런 일이 일어날 지 모른다. 도움을 주시면 감사하겠습니다.

+0

스레드 풀에서 작업을 시작하고 완료 될 때까지 기다리지 않으므로. – usr

+0

@usr 좀 더 정확하게 설명 할 수 있습니까? 나는'multiThreadTest.Notify();'를 실제로 기다린다. 그것이 당신이 의미하는 바라면. – dmigo

+0

BeginInvokeWithAutoEnd는 대기하지 않고 즉시 반환합니다. 즉'Act '가 호출 된 줄도 즉시 반환됩니다. 너가 원하는게 그거야? – usr

답변

0

내게 너무 어리 석다. 시험의

워크 플로우 :
년 - 테스트가 시작됩니다 년 - 예외가 다른 스레드 (현실을 부르 자 "스레드 X")
에 발생합니다
- AppDomain.CurrentDomain.UnhandledException는 동안,
년 - 테스트 완료를 발생 " 스레드 X는 "아직 실행하고 예외를 던지는 완료되지 않은 아직
-"다른 테스트는 이미 내가 AppDomain.CurrentDomain.UnhandledException에 가입하는 것이되지 않도록 예외를 방지 할 수 있다고 생각 알 수없는 이유로

시작하는 동안 스레드 X "는 예외를 throw 던져. 그래서 정말 바보 같아.

1

".NET 런타임"이 소스 인 이벤트의 경우 이벤트 뷰어 (이벤트 뷰어 -> Windows 로그 -> 응용 프로그램)를 확인하십시오. 처리되지 않은 예외가 있으면 거기에 기록해야합니다.

관련 문제