會寫這個的原因來自於,我要實作單元測試的時候發現,將我原本的程式碼,直接套用單元測試的時候會有一些問題,例如私有函式要不要測試,假資料怎麼塞進去。
(
單元測試遇到私有函式,要測試卻要把 私有改成 public ,感覺很奇怪,上網看了文章後,感覺起來,是我的V跟C 切的不好。
所以C 就應該是 public ,如果有"私有"那你就要先有個認知,私有應該是ok的,測試ok的
在單元測試時,不會考慮到這"私有函式"會發生錯誤。
)
我要根據上一篇(簡單的程式範例,並套用MVC 架構)
的程式碼來說明,什麼叫做"不好"單元測試的程式碼。
上一篇的 V 跟C 層 如下,我們要不要測試
私有的
方法一前置步驟
方法一特殊判斷
方法一某商業邏輯
在操作單元測試的時候你會發現,似乎對私有方法做測試很奇怪
如果有這個疑問的時候,你可能需要了解單元測試的意義。
V 層
protected void 數字跟加_Click(object sender, EventArgs e) { Button btn= sender as Button; TextBox1.Text += btn.Text; }
protected void btn計算_Click(object sender, EventArgs e) { 計算方法.方法一(); }C層public class 計算方法 { private static string 方法一前置步驟(){ return "完成"; } private static string 方法一特殊判斷() { return "完成"; } private static string 方法一某商業邏輯() { return "完成"; }public static string 方法一(){ 方法一前置步驟(); 方法一特殊判斷(); 方法一某商業邏輯(); 計算方法Model.儲存計算結果(); return "完成"; }}
所以我將 V跟C 改為
重構程式碼後,這就是 "好"單元測試的程式碼了。
V層
protected void 數字跟加_Click(object sender, EventArgs e) { Button btn= sender as Button; TextBox1.Text += btn.Text; }
protected void btn計算_Click(object sender, EventArgs e) { 方法一(); }
private static string 方法一() { 計算方法.方法一前置步驟(); 計算方法.方法一特殊判斷(); 計算方法.方法一某商業邏輯(); 計算方法Model.儲存計算結果(); return "完成"; }
C層
public class 計算方法 { public static string 方法一前置步驟() { return "完成"; } public static string 方法一特殊判斷() { return "完成"; } public static string 方法一某商業邏輯() { return "完成"; } }
範例下載
參考文章:
http://msdn.microsoft.com/zh-tw/library/dn194488.aspx
http://msdn.microsoft.com/zh-tw/library/dn194489.aspx
http://msdn.microsoft.com/zh-tw/library/dn151705.aspx
沒有留言:
張貼留言