C# / .NET: тестирование BackgroundWorker с помощью NUnit


Этот тест завершается неудачей, если он выполняется с консольным бегуном 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?

Существует ли обходной путь, чтобы заставить тест работать?

3 2

3 ответа:

Я не думаю, что это имеет отношение к перекачке сообщений, поскольку тесты обычно выполняются в любом случае блокирующим образом. Но может случиться так, что событие вызывается в потоке" UI", который использует сообщение windows, которое не обрабатывается.

Итак, если проблема заключалась в том, что сообщение pump или сообщения 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):
}

Вам не хватает обработчика событий BGW DoWork?

Просто добавьте сон перед вашим:

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

Что-то вроде этого:

System.Threading.Thread.Sleep(10000);