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

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

Patricia Arquette
Patricia Arquette原創
2025-01-12 08:10:42913瀏覽

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

單元測試:隔離 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn