使用IoC與DI有何意義? (四) 使用IoC與DI提高可測試性
這一系列的文章,持續維持著一年更新一篇的進度,😛。 今天適逢良辰吉日,我們再次來談談,如何透過IoC與DI增加系統的可測試性。 關於單元測試(Unit Test) 我們知道,有單元測試的存在,我們得以放膽的修改程式碼,無須擔心程式碼的頻繁異動將造成意料之外的副作用。 也因此,有一些團隊追求著程式碼單元測試的覆蓋率。 然而,高覆蓋率的單元測試並不意味著就會有更高品質的程式碼,反而真正重要的是,如何為我們系統中的核心邏輯、重要的核心函式,適當的添加單元測試。 所以,我們接下來要來談一談,如何透過IoC與DI增加程式碼的可測試性。 關於可測試性 你大概也已經知道,我們可以透過Visual Studio為特定的method來建立單元測試。特別是重要的商業邏輯運算函式、或是API,都是單元測試非常能發揮功能的好對象。 然而,你可能會發現有些程式碼似乎難以測試,例如底下這個例子: Console.Write("請輸入金額(USD):"); var amount = int.Parse(Console.ReadLine()); //100 Console.Write("請輸入人數:"); var people = int.Parse(Console.ReadLine()); //5 Financy f = new Financy(); var CostByPeople = f.SplitMoney(amount, people); Console.Write(CostByPeople); 上面這段程式碼看起來簡單,實際上,也真的很簡單😎。 SplitMoney()是一個計算旅遊消費金額分攤的函式。 假設,你和一夥人出國旅遊,在路邊店家吃了一餐,總共100美元,你想計算每個人要負擔多少台幣,就可以使用這個函式。呼叫SplitMoney()時,傳入『美金總金額』和『人數』兩個參數,它就幫你算出一個人要付的台幣金額。 假設我們要針對這個函式進行單元測試,乍看之下似乎並不難,但我們看SplitMoney()的具體內容: public class Financy { public double SplitMoney(double USDAmount, int People) { var currenc