在ASP.NET中,我正在尝试使用HttpRequest对象模拟单元测试。对象的Form集合表示集合是只读的。有没有办法为我的单元测试实现这种行为,而不必提供我自己的httprequest实现?以下代码段因request.Form readonly而失败。 TX。
var request = new HttpRequest("", "http://localhost" + url, "");
request.Form["__EVENTTARGET"] = eventTarget;
AutorefreshSessionHelper.IsRequestForAutoRefresh(request);
答案 0 :(得分:5)
此代码段可以写入表单集合,然后再次禁用它。在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);
答案 1 :(得分:0)
我一直认为,对于单元测试,可以绕过对象可见性所施加的一些保护。
因此,考虑到这一点,HttpRequest的“Form”属性是NameValueCollection类型,它具有受保护的IsReadOnly属性。反思将帮助你在这里:
var pi = typeof(NameObjectCollectionBase).GetProperty("IsReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
pi.SetValue(request.Form, false);
答案 2 :(得分:0)
这似乎不是一个好的单元测试,因为你基本上是在尝试测试ASP.net。由于没有接口,ASP.net没有很多可以模拟的类。
我想这下面有一个你要测试的方法,它接受表单的内容。我建议你尝试测试一下。