Dot-Net

.NET 中的單元測試 System.Threading.Timer

  • March 2, 2010

如何在 .NET 中基於 System.Threading.Timer 對計時器進行單元測試 System.Threading.Timer 有一個回調方法

您可以通過不實際創建對System.Threading.Timer. 相反,創建一個ITimer介面和一個System.Threading.Timer實現它的包裝器。

首先,您需要將回調轉換為事件,以便它可以成為介面的一部分:

public delegate void TimerEventHandler(object sender, TimerEventArgs e);

public class TimerEventArgs : EventArgs
{
   public TimerEventArgs(object state)
   {
       this.State = state;
   }

   public object State { get; private set; }
}

然後創建一個介面:

public interface ITimer
{
   void Change(TimeSpan dueTime, TimeSpan period);
   event TimerEventHandler Tick;
}

還有一個包裝器:

public class ThreadingTimer : ITimer, IDisposable
{
   private Timer timer;

   public ThreadingTimer(object state, TimeSpan dueTime, TimeSpan period)
   {
       timer = new Timer(TimerCallback, state, dueTime, period);
   }

   public void Change(TimeSpan dueTime, TimeSpan period)
   {
       timer.Change(dueTime, period);
   }

   public void Dispose()
   {
       timer.Dispose();
   }

   private void TimerCallback(object state)
   {
       EventHandler tick = Tick;
       if (tick != null)
           tick(this, new TimerEventArgs(state));
   }

   public event TimerEventHandler Tick;
}

顯然,您可以ChangeThreading.Timer. ITimer現在您可以使用假計時器對任何內容進行單元測試:

public class FakeTimer : ITimer
{
   private object state;

   public FakeTimer(object state)
   {
       this.state = state;
   }

   public void Change(TimeSpan dueTime, TimeSpan period)
   {
       // Do nothing
   }

   public void RaiseTickEvent()
   {
       EventHandler tick = Tick;
       if (tick != null)
           tick(this, new TimerEventArgs(state));
   }

   public event TimerEventHandler Tick;
}

每當您想模擬滴答聲時,只需呼叫RaiseTickEvent假貨即可。

[TestMethod]
public void Component_should_respond_to_tick
{
   ITimer timer = new FakeTimer(someState);
   MyClass c = new MyClass(timer);
   timer.RaiseTickEvent();
   Assert.AreEqual(true, c.TickOccurred);
}

引用自:https://stackoverflow.com/questions/2367417