2009-04-15 2 views
2

Этот тест не выполняется, когда он запускается с помощью бегуна консоли NUnit. Это работает, если я бегу только что тест с TestDriven.NET, но если я запускаю весь набор с TestDriven.NET:C# /. NET: Тестирование BackgroundWorker с помощью NUnit

[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, которое не обрабатывается.

Таким образом, если проблема сообщение насос или окна сообщения не обрабатываются, вы можете попробовать, как это, чтобы заменить текущую 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

Это работает. Благодаря! –

+0

Мы обнаружили, что DoEvents() требуется только тогда, когда тест (или предыдущий тест в том же тестовом прогоне) создает форму или элемент Windows. Зачем? –

+0

Поскольку для любого управления WinForms оконные сообщения должны передаваться через насос сообщений, что не происходит, если вы не вызываете 'DoEvents()'. – Lucero

0

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

+0

Фактический класс Я хочу проверить подклассы BackgroundWorker и переопределяет OnDoWork(). Но неважно, добавлю DoWork event-обработчик. Обработчик событий RunWorkerCompleted все еще не запущен. –

-2

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

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

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

System.Threading.Thread.Sleep(10000);

+3

Но это сделало бы тест всегда занимать не менее 10 секунд, когда он должен заканчиваться в миллисекундах. –

Смежные вопросы