在ASP.NET 4.0中模拟HttpRequest

4
我看到了许多类似的帖子,但没有一个能够解决我的问题。
我正在为ASP.NET 4.0 Web应用程序(ASP.NET Forms,而不是MVC)编写单元测试。在代码中有几个位置需要调用ServerVariables集合来调用变量,例如REMOTE_ADDR。由于我的单元测试在执行代码时不会实际初始化HttpRequests,因此像ServerVariables这样的东西就为空,因此当我尝试调用HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")时会出现错误。
我找到的所有解决此问题的方法都涉及MVC,因此它们假定HttpRequest是从HttpRequestBase派生的,但在ASP.NET Forms中并非如此。
我尝试使用Moq,但无法模拟密封类,而HttpRequest不幸地是一个没有接口的密封类。
1个回答

13

可以使用 HttpRequestBaseHttpRequestWrapper 类,但需要进行一些工作。

无论您当前访问的是 HttpContext.Current.Request 还是普通的 Page.Request,您都需要使用可注入的 HttpRequestBase 实例。然后,根据您是在测试还是生产环境中,需要注入不同的 HttpRequestBase 子类。

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

    var liveRequest = new HttpRequestWrapper(HttpContext.Current.Request);
    
  • 对于测试代码,您需要创建并注入自己的HttpRequestBase模拟子类。可以假定Moq能够在运行时为您完成这个过程。


谢谢!我有点犹豫改动现有的代码。现有代码目前是稳定的,也非常复杂,但它是在没有单元测试框架的情况下构建的。我正在尝试通过添加新功能,逐步引入单元测试。我担心如果我必须更改稳定的代码以符合单元测试,将很难说服我的团队接受单元测试——即使在测试驱动开发中,代码本来就应该这样编写。 - Adam
如果答案不错的话,我会给你点赞的。虽然我可能最终还是会选择这条路。 - Adam
最终我选择了不同的路线并使用了 WatiN 进行单元测试。WatiN 从用户界面层测试,因此不需要模拟 HttpRequest。感谢您的帮助。无论是否采取了这个方向,我都将把你的回答标记为答案,因为它确实回答了问题。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接