2012-02-04 79 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