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 ответа:
Я не думаю, что это имеет отношение к перекачке сообщений, поскольку тесты обычно выполняются в любом случае блокирующим образом. Но может случиться так, что событие вызывается в потоке" 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): }