【Unit Test】 系統時間處理

最近手上的專案認真想透過TDD來開發,上完91的課已經是3個月前了。

翻開「單元測試的藝術」這本書,以下稱此書。

記錄一下。

 

此書的第7.5小節,在說明關於注入橫切關注點。

在單元測試中,測試應該要擁有可靠且可重覆執行的特性。

假設,我們有個Function是判斷今天是星期幾(DateTime.Now.DayOfWeek),而返回不同的文字。

我們的測試代碼寫了星期一到星期日不同的判斷。

結果是,七個測試代碼(星期一到日),每次執行只會有一個成功六個失敗。

這樣的測試代碼就失去了意義。

此書7.5節,提出一個解決方法。

自己再創建一個類別,SystemTime。代碼如下:

    public class SysteTime
    {
        private static DateTime? _date;

        public static void Set(DateTime? date)
        {
            _date = date;
        }

        public static DateTime Now
        {
            get
            {
                if (_date.HasValue)
                    return _date.Value;
                else
                    return DateTime.Now;
            }
        }
    }

我有調整過,但原理跟書內一樣。

Production程式碼針對取得今天日期一律改為透過SystemTime.Now取得。

測試代碼在取得SystemTime.Now之前先呼叫SystemTime.Set()方法。

如此,日期變的可操作。