C#/ .NET:使用NUnit测试BackgroundWorker

Ras*_*ber 2 .net c# multithreading unit-testing backgroundworker

使用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");
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这个问题与没有消息循环有关,但我不确定.

使用BackgroundWorker有哪些要求?

是否有解决方法使测试工作?

Luc*_*ero 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):
}
Run Code Online (Sandbox Code Playgroud)