在单元测试中使用HttpContext

13

我正在使用C# 4.0,并且需要对一个服务进行单元测试。服务内的函数返回一个类似于我所称的“expected”变量的路径,这是我期望得到的路径。但是当我运行此测试时,我收到了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);
}
4个回答

17

目前我找不到之前使用的完整HttpContext包装器,但现在我们只需为一个空请求创建上下文,然后从那里开始,就像这样:

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

在单元测试的初始化或单元测试本身中(在创建期望之前),您可以按以下方式设置当前HttpContext:

HttpContext.Current = context;

然后按需填写虚假的上下文和可能的虚假会话状态等。

(编辑:顺便提一句,这都是在VS2008,框架3.5下实现的。)


谢谢回复!这解决了问题,尽管我稍微修改了simpleworkerrequest,加入了正确的路径和地址。 - Rob

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

2

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

[HostType("ASP.NET")]

这个MSDN链接有关于IT技术的很好的介绍。


1

我发这个帖子只是为了供大家参考。这不是一个简单的解决方案,并且涉及到“鸭子类型”(如果它叫起来像鸭子..)。

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库。尽管这不是一个直接的答案。

希望能对你有所帮助。


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