天天看點

.Net 中如何測試靜态方法

大部分Mokc架構是不支援mock靜态方法的,那我們如何測試靜态方法呢?

下面這個類包含了一個靜态方法:

public class MyHelper
{
    public static string GetHelp()
    {
        return "This is help";
    }
}      

這個類調用了上面的Helper類中的靜态方法

public class MyManager
{
    public bool IsManaged { get; set; }
    public void Manage()
    {
        string help = MyHelper.GetHelp();
        IsManaged = (!string.IsNullOrEmpty(help));
    }
}      

如果我們需要測試MyManager類,那麼我們就需要mock MyHelper.GetHelp() 方法,因為MyHelper類我們無法從外面傳入,也無法時候用mock架構來mock。這個類得Manage()方法變得無法測試。

解決方案:

1,如果所有代碼你都可以修改,那麼,最簡單的方法就是避免靜态方法,将靜态方法轉移到一個實體類中,并且使用interface隔離接口和實作邏輯。

2,如果靜态方法你無法修改,比如說是系統提供的幫助類,那麼将靜态方法轉移到一個實體類中,但是使用一個代理函數調用靜态方法,并且使用interface隔離接口和實作邏輯。

3,如果靜态方法你無法修改,還有一個比較快的方法就是,增加一個protected virtual 的成員方法,代理調用靜态方法。測試時,override 這個方法。

一些問題:

如何mock你要測試類中的一些方法?

有一些時候,你測試某個類中的一個方法,這方法會調用這個類中的其他成員方法,處于某種原因,對于這些依賴的成員方法,你也許想mock出來。

如何mock一個private方法?

參考:

TDD: Mock static method
MoQ Mocks – Use virtual method or interfaces? How to mock static class or static member for testing

繼續閱讀