构建一个HttpContext进行测试,如何指定HttpRequest是一个POST?

时间:2012-12-03 22:50:24

标签: c# unit-testing testing httprequest httphandler

我正在为一个以HttpContext作为参数的方法编写一些单元测试。我想在请求是POST时测试行为是否符合预期。

创建System.Net.HttpWebRequest时,很容易设置方法,但在创建System.Web.HttpRequest时,我看不到指定方法的方法,这是HttpContext中使用的方法。

有什么想法吗?

对于上下文,该方法由httphandler调用,如果请求不是POST,则应该抛出405。我知道我可以使用web.config中的Verbs属性过滤允许的方法,但是我会在未来阻止某人改变动词属性以允许其他方法,在这种情况下我希望处理程序要小心它本身。

目前正在使用的助手方法:

    private HttpContext GetHttpContext(string requestUrl)
    {
        var httpRequest = new HttpRequest("", requestUrl, "");            
        var stringWriter = new StringWriter();
        var httpResponce = new HttpResponse(stringWriter);
        return new HttpContext(httpRequest, httpResponce);
    }

1 个答案:

答案 0 :(得分:6)

我建议研究模拟对象以进行单元测试。有一些可用于.NET的模拟框架可以促进这种类型的测试。

例如,文章here使用Moq框架设置HttpMethod。

来自文章:

public ContextMocks(Controller onController, string HTTPMethod)
{
    //...
    Request = new Moq.Mock<HttpRequestBase>();
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod);
    //...
}

也就是说,如果这是一次性测试,我不能强调这一点,并且在您的特定情况下引入对象模拟所产生的开销是不必要的,以下反射将设置HttpMethod:

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST");

正如我之前提到的,如果使用HttpContextHttpRequest等进行测试已成为或将成为一个反复出现的主题,那么请利用模拟框架。从长远来看,你将节省时间。