单元测试多线程应用程序中的事件

时间:2012-02-04 11:33:14

标签: .net multithreading unit-testing nunit moq

我正在对可以在任意数量的线程上工作的组件进行单元测试,并在这些线程上引发事件。我编写了一个简单的事件寄存器,用于断言我期望引发的事件:

    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(或任何其他lib)是否已经包含了其他一些用于执行相同操作的机制?

1 个答案:

答案 0 :(得分:1)

回答你的两个问题:

  • 你重新发明了轮子。我自己发明的车轮模型并不完全相同,但仍然非常相似。我很确定很多其他人也在其他​​地方重新发明了这样一个轮子。

  • Moq不提供此类功能,MSTest也不提供此类功能。上次我使用NUnit时,它没有提供它。

很多基于事件的多线程锅炉板代码似乎一遍又一遍地写。也许是时候构建一个与框架无关的线程和事件帮助程序库...

相关问题