在ASP.NET 4.0中模拟HttpRequest

Ada*_*dam 4 asp.net unit-testing moq

我见过很多类似的线程,但实际上并没有解决我的特殊情况.

我在ASP.NET 4.0 Web应用程序(ASP.NET Forms,而不是MVC)中编写单元测试.代码中有几个点我称之为ServerVariables集合来调用变量REMOTE_ADDR.由于我的单元测试并没有真正开始HttpRequests执行我的代码时,诸如此类ServerVariablesNull,因此错误,当我尝试调用HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")

我发现解决这个问题的所有解决方案都是指MVC,所以他们假设HttpRequest派生自HttpRequestBaseMVC,而不是ASP.NET Forms.

我尝试使用,Moq但你不能模拟密封的类,HttpRequest不幸的是没有接口密封.

Luk*_*keH 13

HttpRequestBaseHttpRequestWrapper类可以用一些工作中使用.

无论您当前访问的位置HttpContext.Current.Request- 或者只是简单Page.Request- 您都需要使用可注入的实例HttpRequestBase.那么你需要注入一个不同的子类,HttpRequestBase具体取决于你是在测试还是在线.

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

    var liveRequest = new HttpRequestWrapper(HttpContext.Current.Request);
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于测试代码,您需要创建并注入自己的模拟子类HttpRequestBase.据推测,Moq可以在飞行中为您做到这一点.