【问题标题】:Mocking HttpRequest in ASP.NET 4.0在 ASP.NET 4.0 中模拟 HttpRequest
【发布时间】:2011-03-16 17:06:11
【问题描述】:

我见过很多类似的话题,但没有一个能真正解决我的特殊情况。

我正在 ASP.NET 4.0 Web 应用程序(ASP.NET 表单,而不是 MVC)中编写单元测试。代码中有几个地方我调用ServerVariables 集合来调用像REMOTE_ADDR 这样的变量。由于我的单元测试在执行我的代码时实际上并没有启动HttpRequests,所以像ServerVariables 这样的东西是Null,因此当我尝试调用HttpContext.Current.Request.ServerVariables("REMOTE_ADDR") 时出错

我发现的所有解决此问题的解决方案都参考了 MVC,因此他们假设 HttpRequest 派生自 HttpRequestBase,它在 MVC 中而不是在 ASP.NET 表单中。

我尝试使用Moq,但您无法模拟密封类,不幸的是HttpRequest 被密封,没有接口。

【问题讨论】:

    标签: asp.net unit-testing moq


    【解决方案1】:

    HttpRequestBaseHttpRequestWrapper 类可以通过一些工作来使用。

    无论您当前在何处访问HttpContext.Current.Request——或者只是普通的Page.Request——您都需要使用HttpRequestBase 的可注入实例。然后,您需要注入 HttpRequestBase 的不同子类,具体取决于您是在测试还是在运行。

    • 对于实时代码,您可能会注入一个包装 HttpContext.Current.RequestHttpRequestWrapper 实例:

      var liveRequest = new HttpRequestWrapper(HttpContext.Current.Request);
      
    • 对于测试代码,您需要创建并注入您自己的模拟子类 HttpRequestBase。大概 Moq 可以即时为您做到这一点。

    【讨论】:

    • 谢谢!不过,我对更改实时代码有点犹豫。实时代码目前稳定且非常复杂,但构建时没有单元测试框架。我正在尝试将单元测试与我正在添加的新功能一起慢慢引入。我担心如果我必须更改稳定的代码以符合单元测试,单元测试将很难卖给我的团队的其他成员——即使在测试驱动的开发中,它从一开始就是这样编写的。
    • +1 是一个很好的答案。我可能最终还是会走这条路。
    • 我最终选择了一条不同的路线并使用 WatiN 进行单元测试。 WatiN 从 UI 层对其进行测试,因此不需要模拟 HttpRequest。谢谢你的帮助。无论如何,我将您的答案标记为答案,因为它确实回答了这个问题,无论这是否是我前进的方向。
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多