События модульного тестирования в многопоточном приложении - PullRequest
2 голосов
/ 04 февраля 2012

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

    public class EventRegister
    {
        private readonly object _lock = new object();
        public int Count { get; private set; }

        public void Increment()
        {
            lock (_lock)
            {
                Count++;
                Monitor.Pulse(_lock);
            }
        }

        public static EventRegister operator ++(EventRegister counter)
        {
            counter.Count++;
            return counter;
        }

        public static implicit operator int(EventRegister counter)
        {
            return counter.Count;
        }

        public bool HasFired { get { return Count > 0; } }

        public void Wait(int unitCount)
        {
            Wait(unitCount, TimeSpan.MinValue);
        }

        public void Wait(int unitCount, TimeSpan timeout)
        {
            lock (_lock)
            {
                var start = DateTime.Now;

                while (Count < unitCount)
                {
                    if (timeout != TimeSpan.MinValue && !Debugger.IsAttached)
                    {
                        Monitor.Wait(_lock, timeout);

                        if (DateTime.Now-start>timeout)
                            throw new TimeoutException();
                    }
                    else
                        Monitor.Wait(_lock);
                }
            }
        }
    }

это работает нормально, и я достаточно доволен этим, но я заново изобрел колесо?NUnit или MOQ (или любая другая библиотека) уже включают какой-то другой механизм для того же самого?

1 Ответ

1 голос
/ 07 февраля 2012

Чтобы ответить на ваши 2 вопроса:

  • Вы заново изобрели колесо.Не совсем та же модель колеса, которую я сам (заново) изобрел, но, тем не менее, довольно похожая.Я уверен, что многие другие люди изобрели такое колесо и где-то еще.

  • Moq не предоставляет такой функциональности, как и MSTest.В прошлый раз, когда я использовал NUnit, он не предоставил его.

Многие многопоточные, основанные на событиях коды котельной плиты, кажется, пишутся снова и снова.Может быть, пришло время создать независимую от фреймворка нить и библиотеку помощников по событиям ...

...