有没有一种方法可以对超时错误进行单元测试?

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);

我希望创建一个单元测试来验证超时异常是否能够正确工作。如果需要更多细节,请告诉我,但这应该足够了。


3
也许你可以使用 Thread.Sleep(5000);。 - TGlatzer
你使用的是哪个框架?在MSTest中,有方法可以限制测试运行的超时时间。 - Dominic Zukiewicz
我正在使用.NET框架中的NUnit。我发现在单元测试中可以使用一个名为TimeoutException的断言。 - Rayshawn
3个回答

8
问题在于你真正测试的内容是什么。你可以很容易地在测试中创建一个小型HTTP服务器,并向其发送请求,从而测试超时代码。但是,你真正测试的是HttpWebRequest是否正确超时。你并不关心它是否正确超时,只需要确保它确实超时,并且你希望确保你的代码处理了TimeoutException异常。
通常情况下,在这种情况下使用测试替身(模拟),它基本上只会抛出TimeoutException

0

0

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


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