2014年5月26日 星期一

C# "好"單元測試的程式碼與"不好"單元測試的程式碼


會寫這個的原因來自於,我要實作單元測試的時候發現,將我原本的程式碼,直接套用單元測試的時候會有一些問題,例如私有函式要不要測試,假資料怎麼塞進去。
(
單元測試遇到私有函式,要測試卻要把 私有改成 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





沒有留言:

張貼留言