我正在使用C#4.0,我需要对服务进行单元测试。服务中的函数返回一个类似于我预期的变量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);
}
答案 0 :(得分:17)
目前我找不到我之前使用的HttpContext的完整包装器,但目前我们只是为空请求创建一个上下文并从那里开始,如下所示:
SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter());
HttpContext context = new HttpContext(request);
然后在单元测试初始化或单元测试本身(在创建预期之前),您可以设置当前的HttpContext,如下所示:
HttpContext.Current = context;
然后根据需要简单地充实虚假的上下文和可能的假会话状态等。
(编辑:顺便说一下,这完全在VS2008中,框架3.5)。
答案 1 :(得分:2)
答案 2 :(得分:2)
您可以使用以下属性修饰您的测试方法:
[TestMethod]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:xxxx/")]
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")]
public void TestMethod()
{
...
}
然后将Default.aspx文件添加到您的单元测试项目中。
在测试方法中,您可以轻松访问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
答案 3 :(得分:1)
我发布此信息以供参考。这不是一个简单的解决方案,并谈论鸭子打字(如果它嘎嘎...):
http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx
这是相关的,值得一读;因为没有IHttpContext,所以不可能创建测试环境实现 - 直到你考虑在这里使用Duck Typing库。虽然这不是一个直接的答案。
希望有所帮助。