2009-04-15 2 views
2

이 테스트는 NUnit 콘솔 러너와 함께 실행될 때 실패합니다. 내가 TestDriven.NET에 그냥 테스트를 실행하는 경우 그것은 작동하지만 내가 TestDriven.NET과 함께 전체 스위트를 실행하지 않을 경우 : 나는 문제가 의심되는 메시지 루프를 가지고 있지 함께 할 수있는 뭔가가C# /. NET : NUnit을 사용하여 BackgroundWork 테스트

[Test] 
public void BackgroundWorkerFiresRunWorkerCompleted() 
{ 
    var runner = new BackgroundWorker(); 
    ManualResetEvent done = new ManualResetEvent(false); 
    runner.RunWorkerCompleted += delegate { done.Set(); }; 

    runner.RunWorkerAsync(); 

    bool res = done.WaitOne(TimeSpan.FromSeconds(10)); 
    // This assert fails: 
    Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds"); 
} 

을하지만, 나는 잘 모르겠다.

BackgroundWorker를 사용하기위한 요구 사항은 무엇입니까?

테스트를 수행 할 수있는 임시 해결책이 있습니까?

답변

7

테스트가 대개 블로킹 방식으로 실행되기 때문에 메시지 펌프와 관련이 있다고 생각하지 않습니다. 그러나 이벤트가 처리되지 않는 Windows 메시지를 사용하는 "UI"스레드에서 호출 될 수 있습니다.

DateTime end = DateTime.Now.AddSeconds(10); 
bool res = false; 
while ((!res) && (DateTime.Now<end)) { 
    Application.DoEvents(); 
    res = done.WaitOne(0): 
} 
+0

그건 작동합니다. 감사! –

+0

DoEvents()는 테스트 (또는 동일한 테스트 실행의 이전 테스트)가 Windows 폼이나 컨트롤을 인스턴스화 할 때만 필요합니다. 왜? –

+0

어떤 WinForms 컨트롤이라도 윈도우 메시지는 메시지 펌프를 통해 전달되어야하기 때문에 DoEvents()를 호출하지 않으면 발생하지 않습니다. – Lucero

0

BGW DoWork 이벤트 처리기가 누락 되었습니까?

+0

하위 클래스 BackgroundWorker를 테스트하고 OnDoWork()를 재정의하려는 실제 클래스입니다. DoWork 이벤트 처리기를 추가해도 아무런 차이가 없습니다. RunWorkerCompleted 이벤트 처리기는 아직 실행되지 않습니다. –

-2

이 그냥 전에 잠을 추가합니다 :

문제가 메시지 펌프 또는 Windows 메시지를 처리하지 않을 경우

그래서, 당신은 당신의 현재 bool res = done.WaitOne(TimeSpan.FromSeconds(10)); 라인을 대체하기 위해이 같은 시도 할 수 이 같은 Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");

뭔가 :

System.Threading.Thread.Sleep(10000);

+3

하지만 이렇게하면 일반적으로 밀리 초 단위로 완료해야하는 테스트가 항상 최소 10 초가 걸립니다. –

관련 문제