模拟.NET HttpWebRequest的连接问题

时间:2008-11-10 15:31:55

标签: .net testing httpwebrequest connection

使用HttpWebRequest类时,有没有办法以编程方式模拟连接问题(连接速度慢,响应无法完成,连接丢失等)?

由于

编辑:为了详细说明,我需要这个用于调试,但最终还是想把它变成一个测试。我正在使用异步方法BeginGetRequestStream,EndGetRequestStream,BeginGetResponse和EndGetResponse。我把它们全部包裹在适当的(我希望)尝试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 个答案:

答案 0 :(得分:3)

@克里斯 不幸的是,微软忽略了make many of the BCL objects easily mockable,因为他们倾向于使用抽象类,并且.NET类被设计封闭(换句话说,对于要被子类覆盖的方法,它需要被明确标记为虚拟),而Java是按设计开放的(也就是说,子类可以覆盖任何方法,除非它们被标记为final)。使用接口或将方法标记为虚拟可以在测试空间中节省许多麻烦。微软现在可能具有可测试性(例如ASP.NET MVC),但对于BCL来说有点晚了。

Typemock Isolator may be able to help,但在这种情况下我不相信Moq。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

至于断开的连接,我想不出任何程序化的东西,但我真的拔出了我的网线以模拟这种情况。

答案 3 :(得分:0)

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