【问题标题】:Is there a way to unit test for a timeout error?有没有办法对超时错误进行单元测试?
【发布时间】:2012-09-10 13:13:27
【问题描述】:

我创建了一个程序来调用数千个 url,我想做的是确保如果 url 超时,我可以将超时错误追溯到 url。我所拥有的是:

          string url = "http://www.google.com";
          HttpWebRequest request = (HttpWebRequest)
                                 WebRequest.Create(url);
        request.Timeout = 5000;
        request.ReadWriteTimeout = 5000;
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101        Firefox/14.0.1";
        //From Fiddler
        DateTime giveUp = DateTime.UtcNow.AddSeconds(5);
        if (DateTime.UtcNow > giveUp)
            throw new TimeoutException("The following url could not be reached: " + url);

我想制作一个单元来测试超时异常是否正常工作。如果您需要更多详细信息,请告诉我,但这应该足够了。

【问题讨论】:

  • 或许你可以使用 Thread.Sleep(5000);
  • 你用的是什么框架?在 MSTest 中有一些方法可以限制测试运行的超时时间。
  • 我在 .NET 框架中使用 NUnit。我确实发现有一个断言 TimeoutException 可以用于单元测试。

标签: c# unit-testing http


【解决方案1】:

问题变成了您真正要测试的内容。你可以很容易地在你的测试中启动一个小型 HTTP 服务器并向它发送一个请求,知道它会超时——这将测试你的超时代码。但是,您实际上是在测试 HttpWebRequest 是否正确超时。您并不关心它是否正确超时,只关心它确实超时并且您想确保您的代码处理 TimeoutException 异常。

在这种情况下通常会使用一个测试替身(模拟),它基本上只是抛出一个TimeoutException

【讨论】:

    【解决方案2】:

    为 Timeout period 编写一个 setter 方法,以便您可以从单元测试中对其进行操作,将其设置得如此之短以至于将引发异常,然后使用您的单元测试的 ExpectedException attribute or in the catch statement 对其进行测试以确保这样的异常已被抛出。

    【讨论】:

      【解决方案3】:

      你应该有众所周知的结果。所以我看到了两种可能性: 1.您信任计时器功能并使用(用于测试)平均持续时间的超时(例如,如果您的持续时间为 40-50 毫秒,则使用 45 毫秒) 2. 您设置自己的服务器并模拟延迟。

      【讨论】:

        猜你喜欢
        • 2010-11-13
        • 2011-03-23
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        相关资源
        最近更新 更多