我创建了一个程序来调用数千个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);
我想创建一个单元来测试超时Exception是否正常工作。如果您需要更多详细信息,请告诉我,但这应该足够了。
答案 0 :(得分:7)
问题就变成了你真正在测试的东西。你可以很容易地在你的测试中启动一个小的HTTP服务器并向它发送一个请求,知道它会超时 - 这会测试你的超时代码。但是,你真的在测试HttpWebRequest
是否正确超时。您并不关心它是否正确超时,只是它确实超出了它,并且您希望确保代码处理TimeoutException
异常。
在这种情况下通常做的是使用测试double(mock),基本上只抛出TimeoutException
。
答案 1 :(得分:0)
将一个setter方法写入Timeout周期,这样你就可以从Unit测试中对它进行操作,设置得很短,以至于抛出异常,然后使用Unit测试的ExpectedException attribute or in the catch statement测试它,以确保抛出异常。
答案 2 :(得分:0)
你应该有众所周知的结果。所以我看到两种可能性: 1.您信任计时器功能并使用(用于测试)平均持续时间的超时(例如,如果您使用的持续时间为40-50毫秒,则使用45毫秒) 2.您使用模拟延迟设置自己的服务器。