c# - 构建用于测试的 HttpContext,如何指定 HttpRequest 是 POST?

标签 c# unit-testing testing httprequest httphandler

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

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

有什么想法吗?

对于上下文,该方法由 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);
    }

最佳答案

我建议研究模拟对象以进行单元测试。有一些适用于 .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 等进行测试是或将成为反复出现的主题,那么请利用模拟框架。从长远来看,您将节省自己的时间。

关于c# - 构建用于测试的 HttpContext,如何指定 HttpRequest 是 POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13693185/

相关文章:

c# - 如何让 PostgreSQL 触发器和 C# Windows Service 协同工作?

swift - 在单元测试中使用本地 JSON 文件

testing - 解决团队间代码冲突的最佳实践

c# - 系统.IO.IOException : -----END RSA PRIVATE KEY not found

c# - 从 SelectListItem 列表中获取项目的值?

javascript - 某些测试文件的 Node.js 代码覆盖率

angular - fixture.debugElement.componentInstance 和 fixture.nativeElement 有什么区别?

c# - NUnit 可扩展性 - 获取失败消息

django - 模型妈妈 : Multiple recipes with foreign key relation to a single recipe

c# - 尝试根据字符串值对列表进行排序