首頁 > 後端開發 > C++ > 如何隔離'DateTime.Now”以進行有效的單元測試?

如何隔離'DateTime.Now”以進行有效的單元測試?

Patricia Arquette
發布: 2025-01-12 08:10:42
原創
929 人瀏覽過

How to Isolate `DateTime.Now` for Effective Unit Testing?

單元測試:隔離 DateTime.Now

在進行單元測試時,經常需要控制當前時間,而無需更改系統的時鐘。當程式碼依賴 DateTime.Now 時,這就會帶來挑戰。

最佳方法是圍繞 DateTime.Now 建立一個抽象層。將此抽象注入到被測試的程式碼中,讓您在單元測試期間模擬當前時間。

替代方案:環境脈絡

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;
    }            
}
登入後複製

使用方法如下:

var now = TimeProvider.Current.UtcNow;
登入後複製

在單元測試中:

var timeMock = new Mock<TimeProvider>();
timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11));
TimeProvider.Current = timeMock.Object;
登入後複製

但是,務必透過呼叫 TimeProvider.ResetToDefault() 來清理您的測試夾具,以避免干擾後續測試。

以上是如何隔離'DateTime.Now”以進行有效的單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板