最近在添加一個新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