如何通过密钥(Request [key])从请求变量获取值,使用moq进行模拟

时间:2014-08-12 10:08:39

标签: asp.net unit-testing moq httphandler http-request-parameters

我正在使用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”

1 个答案:

答案 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);