Dot-Net
.NET 中的單元測試 System.Threading.Timer
如何在 .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; }顯然,您可以
Change從Threading.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); }