Рассмотрим этот модульный тест:
[TestMethod]
public void QueueManager_OnNextItem()
{
bool called = false;
var queue = new QueueManager<int>(
new Moq.Mock<ILogger>().Object,
new Moq.Mock<IItemQueueManagerPerformanceTracker>().Object);
queue.OnNextItem += i => { called = true; };
queue.Add(1);
queue.Start();
//need to RELIABLY wait here
Assert.IsTrue(called);
}
QueueManager
имеет внутренний рабочий поток (Start()
запускает его), который удаляет элемент из очереди и вызывает OnNextItem
.
В этом тесте он всегда всегда терпит неудачу, так как Assert...
вызывается до переключения контекста, чтобы разрешить выполнение called = true
.
Я поставил Thread.Sleep(blah)
до Assert...
.
Это работает, когда тест выполняется изолированно.
Однако запустите его с другой загрузкой модульных тестов, и я обнаружил, что мне представили старый добрый ...
процесс агента был остановлен на время выполнения теста
... который не имеет немедленного разрешения Модульное тестирование - процесс агента был остановлен во время выполнения теста. и оставляет вас уязвимым для Ошибка VS 2010 Test Runner« Процесс агента был остановлен во время выполнения теста. ”
Итак, в свете этого ... какой подход я могу использовать, чтобы убедиться, что я проверил, что мое событие запускается И оно надежно, чтобы не прервать мой процесс сборки?
TIA