我正在使用moq对ASP.NET Http Handler进行单元测试。
这里我试图通过使用HttpRequestBase类的Request属性来访问当前请求的HttpRequest实例。 我们知道简化语法可用于从QueryString,Form,Cookies或ServerVariables集合访问数据,即Request [“key”]。 (正在处理程序的ProcessRequest方法中使用)
但是我无法获得查询字符串值。代码如下:
测试课
[TestMethod()]
private static void MockProcessRequestExecution(AbcHandler abcHandler)
{
NameValueCollection queryString = new NameValueCollection();
queryString.Add("employeeid", "22");
Mock<HttpContextBase> testHttpContext = new Mock<HttpContextBase>();
Mock<HttpResponseBase> testHttpResponse = new Mock<HttpResponseBase>();
Mock<HttpRequestBase> testHttpRequest = new Mock<HttpRequestBase>();
testHttpContext.SetupGet(context => context.Response).Returns(testHttpResponse.Object);
testHttpContext.SetupGet(context => context.Request).Returns(testHttpRequest.Object);
testHttpRequest.SetupGet(request => request.QueryString).Returns(queryString);
testHttpContext.SetupGet(context => context.Request.QueryString).Returns(queryString);
testHttpResponse.SetupSet(response => response.ContentType = "text/plain");
abcHandler.ProcessRequest(testHttpContext.Object);
testHttpResponse.VerifyAll();
}
处理程序方法代码内部提取请求变量如下:
ProcessRequest(HttpContextBase context)
{
var employee = context.Request["employeeid"];
}
employeeid的值为null。
如果将其写为context.Request.QueryString [“employeeid”],则获取该值,但无法更改ProcessRequest方法中编写的代码。 所以问题是,如何获得Request key的值:“employeeid”
答案 0 :(得分:1)
您的代码使用请求Item property,它不仅查看查询字符串。来自msdn:
从QueryString,Form,Cookies或ServerVariables集合中获取指定的对象。
在模拟Request对象时,您还需要模拟Item属性,这是您的代码使用的属性。 (查看QueryString属性的真实HttpRequest
类中的代码未执行,因为您使用的是mock而不是真实对象!)
不幸的是,您需要在模拟中为每个键手动设置Item属性,如:
testHttpRequest.SetupGet(r => r["employeeid"]).Returns("22");
您仍然可以在单元测试中创建NameValueCollection
并使用循环为查询字符串中的每个键设置Item属性。这也允许您测试同时使用Request["employeeid"]
和Request.QueryString["employeeid"]
的代码(这将返回相同的值)。
NameValueCollection queryString = new NameValueCollection{ {"employeeid", "22"} };
//Setup Request Item property for each key in the query string
foreach (var qsKey in queryString.AllKeys)
{
var key = qsKey;
testHttpRequest.SetupGet(r => r[key]).Returns(queryString[key]);
}
//You can still mock the Request.QueryString using the same values
testHttpRequest.SetupGet(r => r.QueryString).Returns(queryString);