10

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

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

有任何想法吗?

对于上下文,该方法由 httphandler 调用,如果请求不是 POST,则应该抛出 405。我知道我可以使用 web.config 中的 Verbs 属性过滤允许的方法,并且我会,但是没有什么可以阻止将来有人更改 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);
    }
4

1 回答 1

8

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

比如这里的文章使用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或将成为一个反复出现的主题,那么请利用模拟框架。从长远来看,您将节省自己的时间。

于 2012-12-04T02:58:43.170 回答