2

此测试在使用 NUnit 控制台运行程序运行时失败。如果我只用 TestDriven.NET 运行该测试,它就可以工作,但如果我用 TestDriven.NET 运行整个套件,它就不行:

[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 有什么要求?

是否有解决方法可以使测试正常工作?

4

3 回答 3

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):
}
于 2009-04-15T12:45:48.253 回答
0

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

于 2009-04-15T12:31:13.247 回答
-2

只需在您之前添加一个睡眠:

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

像这样的东西:

System.Threading.Thread.Sleep(10000);

于 2011-01-10T17:53:42.527 回答