Имитация проблем с подключением для .NET HttpWebRequest - PullRequest
2 голосов
/ 10 ноября 2008

Существуют ли способы программно моделировать проблемы с соединением (медленное соединение, ответ не завершен, соединение обрывается и т. Д.) При использовании класса 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 ]

3 голосов
/ 25 февраля 2009

@ Крис К сожалению, Microsoft пренебрегла , что делает многие объекты BCL легко смоделируемыми , так как они склонны использовать абстрактные классы, а классы .NET закрыты по замыслу (другими словами, для метода, который будет переопределен подклассом , он должен быть явно помечен как виртуальный), в то время как Java открыт по проекту (то есть подкласс может переопределять любой метод, если они не помечены как окончательные). Использование интерфейсов или маркировка методов как виртуальных избавили бы от головной боли в области тестирования. У Microsoft сейчас может быть религия тестируемости (например, ASP.NET MVC), но для BCL уже немного поздно.

Typemock Isolator может помочь , но я не верю, что Moq может в этом случае.

2 голосов
/ 10 ноября 2008

Если это для целей тестирования - то есть для проверки поведения вашего кода, я бы предложил создать класс, который наследуется от HttpWebRequest / HttpWebResponse, и переопределить интересующие вас методы, чтобы вести себя так, как вы хотите - т.е. Thread. Спи для задержек, бросай исключения и т. Д.

0 голосов
/ 10 ноября 2008

Предполагая, что вы пишете модульные тесты для покрытия кода, вы можете использовать фальшивую среду (я лично предпочитаю Moq ), чтобы смоделировать реализацию HttpWebRequest для любых виртуальных методов в классе. В своем макете вы можете сами реализовать, как вы хотите, чтобы тестовый пример вел себя.

0 голосов
/ 10 ноября 2008

Если вы управляете сайтом, который отвечает на запрос, я бы сказал, что перевод потока в спящий режим на некоторое время имитирует медленный ответ. System.Threading.Thread.Sleep (количество миллисекунд)

Что касается разорванного соединения, я не могу придумать ничего программного, но я буквально вытащил сетевой кабель для имитации этого состояния.

...