C# 在单元测试中使用httpcontext

C# 在单元测试中使用httpcontext,c#,unit-testing,c#-4.0,httpcontext,C#,Unit Testing,C# 4.0,Httpcontext,我正在使用C#4.0,需要对服务进行单元测试。服务中的函数返回一个类似于我调用的预期变量的路径,这是我预期返回的路径。但是当我运行这个测试时,我得到的错误是HttpContext.Current为NULL。我可以做些什么来修复此问题,以便运行测试 [TestMethod] public void GetPathTest() { var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Ce

我正在使用C#4.0,需要对服务进行单元测试。服务中的函数返回一个类似于我调用的预期变量的路径,这是我预期返回的路径。但是当我运行这个测试时,我得到的错误是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);
}

您可以尝试查看为ASP.Net单元测试创建的属性,如

[HostType("ASP.NET")]

这篇文章写得很好

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

SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter());
HttpContext context = new HttpContext(request);
然后在单元测试初始化或单元测试本身(在创建预期之前)中,可以按如下方式设置当前HttpContext:

HttpContext.Current = context;
然后根据需要简单地充实假上下文和可能的假会话状态等


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

我发布这篇文章以供参考。这不是一个简单的解决方案,并且谈论Duck类型(如果它嘎嘎作响的话):

这是相关的,值得一读;因为没有iHTTP上下文,所以不可能创建测试环境实现——除非您考虑在这里使用鸭类型库。虽然这不是一个直接的答案


希望对您有所帮助。

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

[TestMethod]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:xxxx/")]
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")]
public void TestMethod()
{
   ...
}
然后将Default.aspx文件添加到单元测试项目中

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

然后将调试器附加到进程,如MSDN所述:

感谢您的回复!虽然我通过添加正确的路径和地址稍微修改了simpleworkerrequest,但它做到了。
public void TestMethod()
{
   System.Diagnostics.Debugger.Break();

   ...
}