2017-03-08 177 views
1

在ASP.NET中,我試圖用HttpRequest對象來模擬單元測試。對象的表單集合表示集合是隻讀的。有沒有辦法爲我的單元測試實現這種行爲,而不必提供我自己的httprequest實現?以下片段失敗,request.Form爲只讀。 TX。嘲笑單元測試的HttpRequest.Form

var request = new HttpRequest("", "http://localhost" + url, ""); 
request.Form["__EVENTTARGET"] = eventTarget; 
AutorefreshSessionHelper.IsRequestForAutoRefresh(request); 

回答

2

這段代碼可以寫入Form集合,然後再次禁用它。在ASP.NET 3.5上測試。

var request = new HttpRequest("", url, ""); 
var formType = request.Form.GetType(); 
formType.GetMethod("MakeReadWrite", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(request.Form, null); 

request.Form["__EVENTTARGET"] = eventTarget; 

formType.GetMethod("MakeReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(request.Form, null); 
0

我一直在想,單元測試可以繞過對象可見性強加的一些保護。因此,考慮到這一點,HttpRequest的「Form」屬性的類型爲NameValueCollection,它具有受保護的IsReadOnly屬性。反射將幫助你在這裏:

var pi = typeof(NameObjectCollectionBase).GetProperty("IsReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
pi.SetValue(request.Form, false); 
0

這似乎不是一個很好的單元測試,因爲你基本上是試圖測試ASP.net。而且由於沒有界面,ASP.net沒有太多可以模擬的類。

我想有一個方法在這個下面,你想測試,它接受表單的內容。我建議你嘗試測試一下。