【问题标题】:Using httpcontext in unit test在单元测试中使用 httpcontext
【发布时间】:2010-07-13 06:33:12
【问题描述】:

我正在使用 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);
}

【问题讨论】:

    标签: c# unit-testing c#-4.0 httpcontext


    【解决方案1】:

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

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

    然后在单元测试中初始化或者在单元测试本身中(在你创建期望之前)你可以设置当前的HttpContext如下:

    HttpContext.Current = context;
    

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

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

    【讨论】:

    • 感谢您的回复!这样做了,尽管我通过添加正确的路径和地址稍微修改了 simpleworkerrequest。
    【解决方案2】:

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

    [HostType("ASP.NET")]
    

    link to MSDN 对此有很好的报道

    【讨论】:

      【解决方案3】:

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

      [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

      【讨论】:

        【解决方案4】:

        我发布此内容以供参考。这不是一个简单的解决方案,并且谈论 Duck Typing(如果它嘎嘎作响..):

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

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          • 2011-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多