Mocking NetworkStream с MemoryStream для модульного тестирования - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть класс, который оборачивает поток с намерением, чтобы этот поток, вероятно, был NetworkStream.Однако в модульном тестировании гораздо проще использовать MemoryStream для проверки работоспособности.Однако я заметил, что MemoryStream и NetworkStream на самом деле не действуют одинаково при записи.

Когда я пишу в MemoryStream, указатель поиска потока устанавливается в конец того, что я написал.Чтобы прочитать то, что я написал, мне нужно настроить указатель поиска на начало того, что я написал.

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

Я предполагаю, что NetworkStream внутренне обрабатывает концепцию указателя поиска и следит за тем, чтобы, даже заполняя данные в поток на другой стороне, он не корректировал указатель.

Мой вопрос в том, как лучше всего высмеять такое же поведение в MemoryStream?Я подумал, что могу просто найти указатель обратно на то же количество байтов, которое я пишу, но это кажется грязным.Кроме того, если я соберу несколько этих потоков вместе или другие обернутые потоки, как они узнают, требуется ли сброс указателя или нет?

1 Ответ

2 голосов
/ 27 сентября 2011

MemoryStream не предназначен для того, как вы его используете.NetworkStream предназначен для того, чтобы вы могли заполнить блок памяти своим выводом.Он не предназначен для чтения второго объекта из того, что пишет исходный объект.

Я бы предложил создать класс FakeNetworkStream.У вас будет два объекта, запись в один добавит данные к другому.Но преимущество FakeNetworkStream заключается в том, что вы можете реализовать патологическое поведение сокетов, чтобы обнаруживать как можно больше ошибок.

  1. Не отправляйте никакие данные, пока пользователь не сбросит поток.Незаметные ошибки могут возникать, когда сокет не очищен, потому что, куда или не отправляются данные, может отличатьсяВсегда ожидая сброса, вы можете иметь неудачные тесты, когда действительно требуется сброс.
  2. Чтение не гарантирует получение всех данных, которые вы запрашиваете.Смоделируйте это, создавая только один байт за раз.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...