Издевательство над невиртуальными событиями (в классах взаимодействия COM)

StackOverflow https://stackoverflow.com/questions/778546

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top