Как я могу создать макет SerialPort, используя библиотеку Moq? - PullRequest
9 голосов
/ 27 мая 2010

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

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

Простой пример:

Одно из устройств, с которыми я взаимодействую, получает команду (переместиться в положение x), возвращает сообщение ACK и переходит в состояние «движения», пока не достигнет упорядоченного положения.

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

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

Слишком много, чтобы спросить?

Ответы [ 2 ]

5 голосов
/ 27 мая 2010

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

Если вы хотите перехватить вызовы класса BCL SerialPort, прежде чем они достигнут аппаратного обеспечения (без необходимости создания интерфейса и реализации последовательного порта, а также реализации теста), то нужно что-то более мощное. Вот для чего Родинки .

Если вы действительно хотите эмулировать устройство, это выходит за рамки «модульного тестирования». На этом уровне можно использовать com0com , чтобы добавить пару виртуальных последовательных портов и написать эмулятор для вашего устройства, с которым ваши тесты могут общаться. На этом уровне автоматизировать тестирование гораздо сложнее (хотя и не невозможно).

0 голосов
/ 27 мая 2010

Если вы используете TDD с макетами, то вы должны позволить своим тестам определять ваши объекты. это уже звучит так, как будто ты задумал дизайн еще до того, как написал какие-либо тесты.

Ваш предварительный дизайн имеет:

  • Отправитель команды
  • Приемник команд
  • Опрос (асинхронный / синхронный)
  • По следствию у вас должна быть Timeout функция

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

Начните красиво и легко.

Попробуйте и протестируйте с идеей «Последний ответственный момент» .

А как насчет синтаксиса, который вы собираетесь использовать?

Возможно, вы захотите проверить это: как проверить надежность моей собственной маленькой встроенной операционной системы

Я даю ссылки на способ работы с оборудованием в Atomic Object и блоге James Greening. У Джеймса есть несколько хороших статей о работе с TDD с оборудованием (не обращайте внимания на вещи с ruby, c и c ++. Если вы работаете с оборудованием, то вы уже играли с c и c ++;)).

Кстати, это выглядит довольно захватывающе, что вы делаете.

...