模拟HttpRequest.Form进行单元测试

时间:2017-03-08 20:52:34

标签: c# unit-testing mocking

在ASP.NET中,我正在尝试使用HttpRequest对象模拟单元测试。对象的Form集合表示集合是只读的。有没有办法为我的单元测试实现这种行为,而不必提供我自己的httprequest实现?以下代码段因request.Form readonly而失败。 TX。

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

3 个答案:

答案 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没有很多可以模拟的类。

我想这下面有一个你要测试的方法,它接受表单的内容。我建议你尝试测试一下。