利用反射編寫私有 Private 方法的單元測試

利用反射編寫私有 Private 方法的單元測試

最近在添加一個新feature時,鑑於要給本身的代碼一是增長代碼的強壯性,二是增長代碼測試的覆蓋率。可是遇到了有些方法是 Private 的,可是在調用這個私有方法的方法裏面已經寫過測試了。代碼就像下面這樣:api

namespace Test
{
    class HttpTest
    {
        public HttpResponse GetHttpResponse(HttpRequest request)
        {
            ...
            GetPrivateValue(request);
            ...
        }

        private string GetPrivateValue(HttpRequest request)
        {
            return System.Text.Encoding.Default.GetString(request.Content);
        }
    }
}

那麼要如何進行這個私有方法的單元測試呢?正好又去閱讀了 CLR via C# ,就想到了反射。函數

那麼如何寫測試代碼呢?單元測試

代碼示例以下:測試

Type type = typeof(HttpTest);
var resolveMethod = Activator.CreateInstance(type);//有多個重載,若構造方法不含無參的構造函數,則須要顯式傳入參數進行初始化

HttpRequest request = new HttpRequest();
obj[] parameter = {request};

MethodInfo methodInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
                .Where(x => x.Name == "GetPrivateValue" && x.IsPrivate)
                .First();

methodInfo.Invoke(resolveMethod,parameter);

首先那個你所須要整個類的 Type 類型,根據這個類 你幾乎能夠拿到和構造出你所想要的任何東西。spa

而後就是建立一個 instance 實例,關於你所須要的類的。code

接下來就是找到你這個類中的私有方法,而後進行調用,就完成了這個私有方法的測試了。get

若是你所要測試的私有方法是個 Generic 泛型的,你須要在 MethodInfo 下面再加一步string

MethodInfo genericMethod = methodInfo.MakeGenericMethod(typeof(<T>))class

相關文章
相關標籤/搜索