Пересмешивание не виртуальных событий (в классах взаимодействия COM) - PullRequest
4 голосов
/ 22 апреля 2009

Редактировать: язык / платформа - C # / .Net

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

Я взял Moq, и мне было довольно легко делать простые макеты, однако в основе моего приложения лежит довольно большой, страшный уровень взаимодействия COM, который мне трудно понять, как правильно выполнить Unit Test. Компонент COM полностью сторонний, поэтому не может быть изменен и реализует то, что представляет собой конечный автомат для обработки телефонных звонков. Компонент уведомляет мое приложение с помощью набора не виртуальных событий , которые я хотел бы протестировать в определенных порядках для имитации изменений состояния, однако Moq не предлагает способа сделать это ни для чего, кроме виртуальных событий.

Итак, мой вопрос к более знающим TDDers / Mockists: Как бы вы провели тестирование такого рода вещей?

Очевидно, что TypeMock поддерживает это (в обмен на собственные недостатки), но я бы предпочел не использовать его по разным причинам, касающимся безопасности типов и моего общего ощущения, что он делает что-то неискреннее за моей спиной.

1 Ответ

4 голосов
/ 22 апреля 2009

Вы можете имитировать только виртуальные / абстрактные методы, если вы не используете что-то сверхпрочное, например TypeMock.

Когда вам нужно протестировать код, который вы не можете контролировать, вам придется сломать свою зависимость от этого кода. Создайте фасад, который имеет методы, свойства и события непроверяемого класса. Придерживайтесь тех, которые вы на самом деле используете; это уменьшит размер кода, который вы должны написать. Код против фасада, которым вы управляете, а не код, который вы не делаете.

Последнее, что нужно сделать, это использовать один из нескольких методов для доступа к фасаду, который позволит вам заменить макет во время испытаний. Вы можете использовать файлы конфигурации, структуры внедрения зависимостей, ленивые экземпляры и т. Д. Таким образом, вы можете макетировать свой фасад и использовать его для модульных тестов. Конечно, вам все равно придется выполнить некоторые интеграционные тесты, чтобы убедиться, что ваш фасад работает правильно с реальным классом взаимодействия COM.

Для вдохновения взгляните на System.Web.Abstractions. Он содержит много классов, которые обертывают базовые классы ASP.NET, чтобы сделать их смешными.

...