寫程式常常會有很多難以隔離的邏輯,這邊舉一個關於時間的例子。 如果要你寫一個判斷是不是聖誕節的簡單程式你會怎麼寫? public bool IsTodayXmas() { var today = DateTime.Today; if (today.Month == 12 && today.Day == 16) { return true; } else { return false; } } . 上面的邏輯正確且簡單,唯一的缺點是不好測試。為什麼呢? 試著寫一段 Unit Test 看看,你可能會像下面這樣寫 [TestMethod] public void TodayIsXmas() { var checker = new XmasChecker(); var result = checker.IsTodayXmas(); Assert.AreEqual(true, result); } . 這個測試這樣寫的話,只有在聖誕節當天才會 Pass. 所以困難的地方在於怎麼把變動的邏輯給隔離開來。 下面提供幾個作法,在不影響已發佈的使用下來讓程式可以測次,各有優缺點 首先都是先將 DateTime.Today; 這個邏輯提取方法 GetToday(),然後 透過新的建構子 透過新的屬性 透過新的方法 使用繼承,變更 GetToday() 的存取範圍為 Protected virtual 大概是這幾種方法,前三種作法都差不多,GetToday() 邏輯如下 private DateTime? _today = null; private DateTime GetToday() { return _today ?? Dat...