【问题标题】:Unit testing http handlers?单元测试http处理程序?
【发布时间】:2010-05-07 19:05:41
【问题描述】:

我当前基于 Asp .net 的项目大量使用 Http 处理程序来处理各种请求?那么,有什么方法可以让我使用单元测试用例测试每个处理程序的功能?我们正在使用 Nunit 和 Moq 框架来促进单元测试。

【问题讨论】:

    标签: asp.net unit-testing httphandler


    【解决方案1】:

    我认为不久前的这些博客条目是相关的:

    http://www.kongsli.net/nblog/2009/05/03/aspnet-35-improving-testability-with-systemwebabstractions/

    http://www.kongsli.net/nblog/2009/05/28/testability-with-systemwebabstractions-and-no-mock-framework/

    有关如何对 HttpHandler 进行单元测试的示例,请参见第一篇文章中的示例 #2。

    【讨论】:

      【解决方案2】:

      如果您不关心单元测试并且想要快速而肮脏的东西,您可以使用Fiddler

      如果您想要更集成的方法(单元测试),您可以使用 WebRequest 和 WebResponse。

      【讨论】:

        【解决方案3】:

        你当然可以,虽然我没有“愤怒”地做自己。
        使用 System.Net.WebClient 对您的处理程序进行 HTTP 调用,并评估返回的内容,这将允许您测试处理程序的面向公众的接口。

        在此示例中,我对目标进行了硬编码,并且我在 WebClient 上使用了一个方法,该方法将返回一个字符串。

        WebClient 还允许您访问 ResponseHeaders、Encoding 和其他有用的“webby”内容;您也可以上传信息。

        using System.Net;
        
        namespace UnitTestHttpHandler
        {
            public class TestHarness
            {
                public static string GetString()
                {
                    WebClient myWebClient = new WebClient();
                    return myWebClient.DownloadString("http://localhost/Morphfolia.Web/ContentList.ashx");
                }
            }
        }
        

        然后,您可以使用 TestHarness 调用目标 HttpHandler 并验证您的测试结果(如果您知道的话,可以使用更好的测试方法 - 我不是单元测试专家)。

            [TestMethod]
            public void TestMethod1()
            {
                string x = UnitTestHttpHandler.TestHarness.GetString();
        
                Assert.IsTrue(x.Length > 5);
            }
        

        【讨论】:

        • 但是我们需要将请求路由(使用配置文件)到正确的处理程序,并且服务器也需要运行,对吧?那么如何模拟呢?
        • 是的,需要运行 Web 服务器。就配置而言,我无法根据经验说话,但我认为它会以类似于在单元测试时通过配置指定其他设置的方式完成(?)。抱歉,我不能提供更多。
        • 这实际上工作得很好,唯一的问题是你当然不能通过你的目标处理程序进行调试。
        【解决方案4】:

        这是一篇文章,它清楚地解释了有关 http 处理程序的单元测试。

        http://jgvimalan.wordpress.com/2011/08/30/unit-test-for-http-handler/

        【讨论】:

          【解决方案5】:

          您可以使用其他答案中提到的方法对处理程序进行集成测试,要进行单元测试,您需要创建一些接口并从处理程序中提取核心功能,以及创建一些模拟对象。

          您将无法对它的所有部分进行单元测试,因为它依赖于外部资源(您将要模拟的资源)——但这很好,这就是我们进行集成测试的原因。

          【讨论】:

            【解决方案6】:

            如果您想测试处理程序和 Web UI 之间的通信,那么是的,集成测试就是解决这个问题的方法。为了对您的逻辑进行单元测试,您能否将您的业务逻辑分成其他类(我会为业务层使用单独的程序集)并在您的表示层之外模拟/单元测试这些类?

            一旦您拥有一个与表示层分离的结构化(和单元测试)业务层,您的处理程序就可以简单地实例化您的具体实例并调用提供的方法。完成此操作后,您就可以进行集成测试,因为您的业务逻辑已经过单元测试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-08
              • 1970-01-01
              • 2018-09-03
              • 2013-10-24
              • 2011-06-23
              • 1970-01-01
              • 2021-01-21
              相关资源
              最近更新 更多