2012-02-04 104 views
2

我正在对一个组件进行单元测试,该组件可以处理任意数量的线程并在这些线程上引发事件。我写了我使用断言,我期待的事件已经提出了一个简单的事件寄存器:多线程应用程序中的单元测试事件

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

要回答你的两个问题:

  • 你已经彻底改造了车轮。不同于我自己发明的轮模型,但非常相似。我很确定很多其他人也在其他​​地方重塑了这样一个轮子。

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

很多多线程,基于事件的锅炉板代码似乎一遍又一遍地被写入。也许现在是时候构建一个框架不可知的线程和事件帮助程序库...

+0

你开始了,我会加入你,在BitBucket上见你? https://bitbucket.org/mylesmcdonnell – 2012-02-06 21:04:14