3

我创建了一个程序来调用数千个 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);

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

4

3 回答 3

8

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

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

于 2012-09-10T13:19:57.373 回答
0

为 Timeout 周期编写一个 setter 方法,以便您可以从单元测试中对其进行操作,将其设置得如此之短以至于将引发异常,然后使用ExpectedException 属性或在单元测试的 catch 语句中对其进行测试,以确保这样已抛出异常。

于 2012-09-10T13:18:16.717 回答
0

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

于 2012-09-10T13:44:47.110 回答