1

我正在使用 moq 对 ASP.NET Http 处理程序进行单元测试。

在这里,我尝试使用 HttpRequestBase 类的 Request 属性访问当前请求的 HttpRequest 实例。正如我们所知,简化语法可用于访问 QueryString、Form、Cookie 或 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" 的值

4

1 回答 1

1

您的代码使用 Request Item 属性,它不仅查看查询字符串。来自 msdn:

从 QueryString、Form、Cookies 或 ServerVariables 集合中获取指定的对象。

当您模拟 Request 对象时,您还需要模拟 Item 属性,这是您的代码使用的。(查看 QueryString 属性的真实HttpRequest类中的代码不会执行,因为您使用的是模拟而不是真实对象!)

不幸的是,您需要在模拟中为每个键手动设置 Item 属性,如下所示:

testHttpRequest.SetupGet(r => r["employeeid"]).Returns("22");

您仍然可以NameValueCollection在单元测试中创建一个并使用循环为查询字符串中的每个键设置 Item 属性。这也将允许您测试同时使用Request["employeeid"]and的代码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);
于 2014-08-12T11:09:16.817 回答