Наиболее надежный подход к модульному тестированию, используемый как часть принятия сборки, когда класс содержит многопоточность - PullRequest
0 голосов
/ 24 марта 2011

Рассмотрим этот модульный тест:

    [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 Ошибка Runner Test «Процесс агента был остановлен во время выполнения теста. ”

Итак, в свете этого ... какой подход я могу использовать для проверки того, что мое событие запускается И это надежно, чтобы не мешать процессу сборки?

ТИА

1 Ответ

3 голосов
/ 24 марта 2011

Один из вариантов - назначить OnNextItem ответственным за разблокировку:

// Setup as before
object monitor = new object();
queue.OnNextItem += i => { lock(monitor) { Monitor.Pulse(monitor); }};

lock (monitor)
{
    queue.Add(1);
    queue.Start();
    Assert.IsTrue(Monitor.Wait(monitor, 1000));
}

Это будет ждать до одной секунды для вызова OnNextItem и завершится неудачей, если время ожидания истекло.

...