Как выполнить модульное тестирование ArcObjects с помощью Mocking?

10

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

Кто-нибудь успешно использует насмешки против таких мыслей, как IFeature, IGeometry, IWorkspace и т. Д. Если это так, я хотел бы увидеть некоторые примеры того, как вы это делаете. Меня не очень волнует, какой фальшивый фреймворк вы используете, просто очень хотелось бы посмотреть, как вы это делаете.

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

BlinkyBill
источник
Для тех, кто может не знать о Mocking (как я), пожалуйста, перейдите по этой ссылке. Интересные вещи. stackoverflow.com/questions/300177/…
Саймон

Ответы:

14

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

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

Я могу привести один конкретный пример из нашего проекта. Часть кода, казалось, зависела от IMxDocument. Оказалось, единственная причина была в том, что активный вид нужно было обновить. Поэтому мы создали интерфейс IViewRefresher и работали только над этим; легко издеваться и тестировать. Кроме того, это делает цель коды гораздо более четкой и снимает соблазн для кого - то , чтобы начать делать смешные вещи с IMxDocument , что они не должны были делать , потому что все , что мы хотели сделать здесь было обновление. То же самое упражнение можно выполнить с большим количеством кода ArcObjects.

Кроме того, мы обернули весь доступ к классам пространственных объектов в безопасные оболочки типов, снова предоставляя поддельный код, экранирующий бизнес-код от ArcObjects.

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

Таким образом, я не разочаровываю насмешки, но я бы посоветовал имитировать на уровне абстракции, отличном от ArcObjects.

Cumbayah
источник
отличный ответ Cumbayah. У меня также есть много трудностей модульного тестирования AO-кода. Приведенный вами пример был великолепен (IViewRefresher), и я мог бы применить его к своей работе здесь. Можете ли вы привести дополнительные примеры?
Джордж Сильва
Спасибо, Кумбайя. Это то, что я сейчас делаю для средних и крупных проектов, создавая отдельную сборку для абстрагирования всей реализации AO. Именно эту абстракцию я хотел бы протестировать, не прибегая к сохраненным данным, будь то рабочие области XML или базы геоданных того или иного рода. Я нахожу, что время от времени с различными данными возникают новые проблемы, для которых затем необходимо создать тесты, что требует дополнительных тестовых данных. Со временем у меня появилось так много тестовых данных для всех тестовых случаев, что проекты стали огромными для управления и перемещения, не говоря уже о загрузке с моего автоматического сервера сборки.
BlinkyBill
Кумбайя, это звучит невероятно. Я хотел бы привести несколько примеров. Вы когда-нибудь рассматривали возможность представить что-то по этому вопросу на одной из конференций ESRI? Я думаю, что сообщество ESRI / GIS умирает от такого рода вещей. Очень хотелось бы, чтобы началось движение с открытым исходным кодом для тестирования / насмешки над ArcObjects.
Кит Г
Это старая тема, я понимаю, но есть ли шанс, что мы сможем получить образец вашей "собственной геометрии"? Я пытаюсь заставить свою организацию двигаться в направлении модульного тестирования, но я зацикливаюсь на обезьяне ArcObjects.
Люк
4

Модульное тестирование для разработчиков Esri, выполненное Дейвом Боуманом и Брайаном Нойлом, является неплохой отправной точкой, особенно после того, как они выпустили некоторый код для просмотра.

bwreilly
источник
Спасибо за указатель bwreilly. Однако Дэйв просто использует XML-представления функций. Так что, хотя это помогает, оно все еще опирается на хранение данных для тестов, от которых я пытаюсь избавиться.
BlinkyBill