Comment tester unitairement ArcObjects avec Mocking?

10

Je suis un grand fan des tests unitaires, mais j'utilise toujours un FGDB pour saisir des fonctionnalités permettant d'exécuter des tests unitaires lors de l'utilisation du cadre ArcObjects.

Est-ce que quelqu'un utilise avec succès la moquerie contre des idées comme IFeature, IGeometry, IWorkspace, etc. Si c'est le cas, j'aimerais voir quelques exemples de la façon dont vous le faites. Je ne me soucie pas vraiment du cadre de simulation que vous utilisez, juste voir comment vous le faites serait grandement apprécié.

Le problème que je vois est que vous devez découper et découper entre tant d'interfaces sur le même objet, que la surcharge de création d'un objet maquette représentatif serait énorme.

BlinkyBill
la source
Pour tous ceux qui ne connaissent pas Mocking (comme moi), veuillez consulter ce lien. Des trucs intéressants. stackoverflow.com/questions/300177/…
Simon

Réponses:

14

Sur un grand projet, nous avons assez bien réussi à isoler le code ArcObjects de notre logique métier. C'est généralement la voie à suivre, je dirais, plutôt que d'essayer de tout simuler, même s'il est possible d'utiliser des cadres de simulation pour obtenir une partie du chemin.

Demandez-vous pourquoi vous ressentez le besoin de vous moquer. Généralement, c'est à cause d'une abstraction manquante. Pensez à de petites responsabilités et minimisez la surface de l'énorme et laid monstre ArcObject. Évitez de faire glisser les types ArcObject simplement parce que certains de leurs aspects sont nécessaires quelque part.

Je peux donner un exemple concret de notre projet. Une partie du code semblait dépendre d'IMxDocument. Il s'est avéré que la seule raison était que la vue active devait être rafraîchie. Nous avons donc créé une interface IViewRefresher à la place et n'avons travaillé que sur cela; facile à se moquer et à tester. De plus, cela rend l' intention du code beaucoup plus claire et supprime la tentation pour quelqu'un de commencer à faire des choses drôles avec l'IMxDocument qu'ils n'étaient pas censés faire parce que tout ce que nous voulions faire ici était actualiser. Le même exercice peut être effectué avec une grande partie du code ArcObjects.

De plus, nous avons encapsulé tous les accès aux classes d'entités dans des encapsuleurs de type sécurisé, fournissant à nouveau du code factice protégeant le code métier d'ArcObjects.

Nous avons discuté de ne même pas utiliser les types de géométrie d'ArcObjects, mais actuellement nous autorisons ces interfaces à être utilisées directement dans notre code. (Cependant, seule la connaissance de l'interface est autorisée et toutes les instanciations de géométries utilisent notre propre usine de géométrie.)

En résumé, je ne décourage pas la moquerie, mais j'encouragerais la moquerie à un niveau d'abstraction différent d'ArcObjects.

Cumbayah
la source
grande réponse Cumbayah. J'ai également beaucoup de difficultés à tester le code AO. L'exemple que vous avez donné était excellent (IViewRefresher) et je pourrais l'appliquer à mon travail ici. Pouvez-vous donner d'autres exemples?
George Silva
Merci Cumbayah. C'est ce que je fais actuellement sur des projets de moyenne à grande envergure, en créant un assemblage séparé pour abstraire toute implémentation AO. C'est cette abstraction que j'aimerais tester sans avoir recours aux données stockées, que ce soit des espaces de travail XML ou des géodatabases d'une sorte ou d'une autre. Je trouve que de temps en temps avec différentes données, de nouveaux problèmes surgissent, qui doivent ensuite avoir des tests créés pour, ce qui nécessite des données de test supplémentaires. Au fil du temps, j'ai tellement de données de test pour tous les cas de test, que les projets deviennent énormes à gérer et à déplacer, téléchargés par mon serveur de construction automatisé.
BlinkyBill
Cumbayah, cela semble incroyable. J'adorerais quelques exemples. Avez-vous déjà envisagé de présenter quelque chose à ce sujet lors d'une des conférences de l'ESRI? Je pense que la communauté ESRI / GIS est en train de mourir pour ce genre de choses. J'adorerais voir un mouvement open source commencer pour tester / se moquer d'ArcObjects.
Keith G
C'est un vieux sujet que je comprends, mais est-il possible que nous puissions obtenir un échantillon de votre "propre usine de géométrie"? J'essaie de faire évoluer mon organisation dans le sens des tests unitaires, mais je suis accroché au singe ArcObjects.
Luke
4

Les tests unitaires pour les développeurs Esri par Dave Bouwman et Brian Noyle sont un très bon point de départ - en particulier depuis qu'ils ont jeté du code à regarder.

bwreilly
la source
Merci pour le pointeur bwreilly. Cependant, Dave utilise simplement des représentations XML des fonctionnalités. Donc, même si cela aide, cela repose toujours sur le stockage de données pour les tests, ce dont j'essaie de m'éloigner.
BlinkyBill