2

HttpWebRequest クラスを使用するときに接続の問題 (接続が遅い、応答が完了しない、接続が切断されるなど) をプログラムでシミュレートする方法はありますか?

ありがとう

編集:さらに詳しく説明するには、デバッグのためにこれが必要ですが、最終的にはテストに変えたいと思います。非同期メソッドの BeginGetRequestStream、EndGetRequestStream、BeginGetResponse、および EndGetResponse を使用しています。私はそれらをすべて適切にラップしました (願っています) 発生した例外をログに記録する Try Catch ブロック。

これがいくつかのケースで機能することはわかっています (たとえば、ネットワーク ケーブルを抜いたときなど)。しかし、まれに (つまり、要求している Web サイトが遅い場合のみ)、システムがクラッシュし、イベント ログに記録されます。

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 オブジェクトの多くを簡単にモック可能にすることを怠りました。一方、Java は設計によりオープンです (つまり、サブクラスは、final としてマークされていない限り、任意のメソッドをオーバーライドできます)。インターフェイスを使用するか、メソッドを仮想としてマークすると、テスト スペースで多くの頭痛の種が解消されます。Microsoft は現在、テスタビリティの宗教 (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 に答える