Модульное тестирование с потоками в C # - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть некоторый клиентский код, который связывается с сервером с помощью потоков, которые я хочу протестировать.Я хочу проверить, что клиент отправляет на сервер правильные команды.

Для этого я создал метод Connect, который принимает два потока: один, из которого клиент читает, и один, в который клиент пишет.Затем я могу предоставить MemoryStream обоим и прочитать команды, отправленные из MemoryStream, в который клиент пишет.

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

Я не могу передать MemoryStream этому методу, поскольку метод write записывает в некоторый внутренний байтовый массив,из которого метод чтения также читает из.Если я передам это клиенту, он сможет прочитать только что отправленные им команды!

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

По сути, мне нужны два потока: S1и S2.Один поток передается клиенту, другой - серверу.
Метод чтения S1 «подключен» к методу записи S2 => S1 читает то, что пишет S2.
Метод записи S1 «подключен» к методу чтения S2=> S2 читает то, что пишет S1.
Это совершенно нормальный случай, когда клиент общается с сервером.Здесь я просто хочу сделать это в памяти.Как я могу закодировать это?

Ответы [ 3 ]

5 голосов
/ 23 декабря 2010

Почему бы не абстрагировать отправку команд от транспорта команд?

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

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

3 голосов
/ 23 декабря 2010

Вы можете создать подкласс Stream, который принимает два других потока в конструкторе, а затем переопределить методы Read и Write для чтения и записи в правильных потоках.

Обязательно прочитайте Примечания для разработчиков раздел на странице MSDN для класса Stream.

0 голосов
/ 23 декабря 2010

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

...