單元測試:隔離 DateTime.Now
在進行單元測試時,經常需要控制當前時間,而無需更改系統的時鐘。當程式碼依賴 DateTime.Now 時,這就會帶來挑戰。
最佳方法是圍繞 DateTime.Now 建立一個抽象層。將此抽象注入到被測試的程式碼中,讓您在單元測試期間模擬當前時間。
替代方案:環境脈絡
<code class="language-csharp">public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return TimeProvider.current; } set { if (value == null) { throw new ArgumentNullException("value"); } TimeProvider.current = value; } } public abstract DateTime UtcNow { get; } public static void ResetToDefault() { TimeProvider.current = DefaultTimeProvider.Instance; } }</code>
使用方法如下:
<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
在單元測試中:
<code class="language-csharp">var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
但是,務必透過呼叫 TimeProvider.ResetToDefault() 來清理您的測試夾具,以避免干擾後續測試。
以上是如何隔離'DateTime.Now”以進行有效的單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!