【问题标题】:Unit Testing events in multi-threaded app多线程应用程序中的单元测试事件
【发布时间】:2012-02-04 11:33:14
【问题描述】:

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

    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(或任何其他库)是否已经包含一些其他机制来做同样的事情?

【问题讨论】:

    标签: .net multithreading unit-testing nunit moq


    【解决方案1】:

    回答您的 2 个问题:

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

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

    许多多线程、基于事件的样板代码似乎被一遍又一遍地编写。也许是时候构建一个与框架无关的线程和事件助手库了……

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多