2009-04-15 71 views
2

使用NUnit控制檯運行器運行時,此測試失敗。如果我跑得也與TestDriven.NET測試它的工作原理,但如果我運行整個套件與TestDriven.NET:C#/。NET:使用NUnit測試BackgroundWorker

[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

我不認爲它與消息泵有關,因爲測試通常以阻塞的方式運行。但它可能是事件在「UI」線程上調用的,該線程使用了未經處理的Windows消息。

所以,如果這個問題是在消息泵或Windows消息沒有被處理,你可以嘗試這樣的替換當前bool res = done.WaitOne(TimeSpan.FromSeconds(10));行:

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

這有效。謝謝! – 2009-04-15 12:49:13

+0

我們發現DoEvents()只有在測試(或在同一測試運行中的先前測試)實例化Windows窗體或控件時纔是必需的。爲什麼? – 2010-04-07 23:56:52

0

您是否缺少BGW DoWork事件處理程序?

+0

我想要測試的實際類子類BackgroundWorker並重寫OnDoWork()。但是,如果我添加一個DoWork事件處理程序,則沒有區別。 RunWorkerCompleted事件處理程序仍未運行。 – 2009-04-15 12:40:07

-2

您之前只需添加一個睡眠:

Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");

事情是這樣的:

System.Threading.Thread.Sleep(10000);