在unit testing中使用httpcontext

我正在使用C#4.0,我需要对服务进行unit testing。 服务中的函数返回一个类似于我预期的变量i的路径,这是我期望回来的路径。 但是,当我运行此测试时,我得到HttpContext.Current为NULL的错误。 我该怎么做才能解决这个问题,以便可以运行测试?

[TestMethod] public void GetPathTest() { var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Certificates/")); var path = _mockService.Setup(o => o.GetPath()).Returns(expected); } 

目前我找不到我之前使用过的HttpContext的完整包装器,但此刻我们只是为空请求创建一个上下文并从那里开始,如下所示:

 SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter()); HttpContext context = new HttpContext(request); 

然后在unit testing初始化​​或unit testing本身(在创建预期之前),您可以设置当前的HttpContext,如下所示:

 HttpContext.Current = context; 

然后根据需要简单地充实假上下文和可能的假会话状态等。

(编辑:这一切都在VS2008中,顺便说一下框架3.5)。

您可以尝试查看为ASP.Netunit testing创​​建的属性,例如

 [HostType("ASP.NET")] 

这个到MSDN的链接有很好的写作

您可以使用以下属性修饰您的测试方法:

 [TestMethod] [HostType("ASP.NET")] [UrlToTest("http://localhost:xxxx/")] [AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")] public void TestMethod() { ... } 

然后将Default.aspx文件添加到您的unit testing项目中。

在测试方法中,您可以轻松访问HttpContext。 如果要调试,可以使用一些跟踪或使用System.Diagnostics.Debugger.Break()指令中断调试执行。

 public void TestMethod() { System.Diagnostics.Debugger.Break(); ... } 

然后按照MSDN的说明将调试器附加到进程: https : //msdn.microsoft.com/en-us/library/vstudio/c6wf8e4z(v = vs.100) .aspx

我发布这个作为参考。 这不是一个简单的解决方案,并谈论鸭子打字(如果它嘎嘎…):

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx

这是相关的,值得一读; 因为没有IHttpContext,所以不可能创建测试环境实现 – 直到你考虑在这里使用Duck Typing库。 虽然这不是一个直接的答案。

希望有所帮助。