2

使用 HttpWebRequest 类时,有没有办法以编程方式模拟连接问题(连接缓慢、响应未完成、连接断开等)?

谢谢

编辑:为了详细说明,我需要这个来调试,但最终想把它变成一个测试。我正在使用异步方法 BeginGetRequestStream、EndGetRequestStream、BeginGetResponse 和 EndGetResponse。我已经将它们全部包装在适当的(我希望)Try Catch 块中,记录发生的异常。

我知道这适用于某些情况(例如,当我拔出网络电缆时)。但在极少数情况下(即仅当我请求的网站速度很慢时)我的系统崩溃了,我在事件日志中得到了这个

Exception: System.Net.WebException

Message: The request was aborted: The connection was closed unexpectedly.

StackTrace:    at System.Net.ConnectStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   at System.IO.Compression.DeflateStream.ReadCallback(IAsyncResult baseStreamResult)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.CompleteCallback(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

我假设它来自 HttpWebRequest 但我的所有代码再次包装在 Try Catch 块中。

在这种情况下,模拟会有所帮助吗?

4

4 回答 4

3

@Chris 不幸的是,Microsoft 忽略了使许多 BCL 对象易于模拟,因为它们倾向于使用抽象类,并且 .NET 类在设计上是封闭的(换句话说,对于被子类覆盖的方法,它需要被显式标记为虚拟),而 Java 是按设计开放的(即,子类可以覆盖任何方法,除非它们被标记为最终方法)。使用接口或将方法标记为虚拟会在测试空间中省去很多麻烦。微软现在可能有可测试性信仰(例如 ASP.NET MVC),但对于 BCL 来说有点晚了。

Typemock Isolator可能会有所帮助,但在这种情况下,我不相信 Moq 可以。

于 2009-02-25T06:19:05.393 回答
2

如果这是出于测试目的 - 即检查您的代码行为,我建议创建一个继承自 HttpWebRequest/HttpWebResponse 的类,并覆盖您感兴趣的方法以按照您想要的方式运行 - 即 Thread.Sleep 延迟, 抛出异常等。

于 2008-11-10T16:00:59.643 回答
0

如果您控制响应请求的站点,我会说让线程休眠一段时间会模拟缓慢的响应。System.Threading.Thread.Sleep(毫秒数)

至于断开的连接,我想不出任何程序化的东西,但我确实拔出了我的网络电缆来模拟这种情况。

于 2008-11-10T15:59:12.593 回答
0

假设您正在编写单元测试来覆盖代码,您可以使用模拟框架(我个人更喜欢Moq)来模拟类上任何虚拟方法的 HttpWebRequest 的实现。在您的模拟中,您可以自己实现您希望测试用例的行为方式。

于 2008-11-10T16:03:32.210 回答