Wie teste ich ArcObjects mit Mocking?

10

Ich bin ein großer Fan von Unit-Tests, benutze aber immer noch eine FGDB, um Funktionen zum Ausführen von Unit-Tests zu nutzen, wenn ich das ArcObjects-Framework verwende.

Verwendet jemand erfolgreich Spott gegen Gedanken wie IFeature, IGeometry, IWorkspace usw. Wenn ja, würde ich gerne einige Beispiele dafür sehen, wie Sie es tun. Es ist mir eigentlich egal, welches spöttische Framework Sie verwenden, nur zu sehen, wie Sie es tun, wäre sehr dankbar.

Das Problem, das ich sehe, ist, dass Sie zwischen so vielen Schnittstellen auf demselben Objekt schneiden und würfeln müssen, dass der Aufwand für die Erstellung eines repräsentativen Scheinobjekts enorm wäre.

BlinkyBill
quelle
Für alle anderen, die möglicherweise nichts über Mocking wissen (wie ich), siehe diesen Link. Interessantes Zeug. stackoverflow.com/questions/300177/…
Simon

Antworten:

14

Bei einem großen Projekt ist es uns recht gut gelungen, ArcObjects-Code von unserer Geschäftslogik zu isolieren. Das ist im Allgemeinen der richtige Weg, würde ich sagen, anstatt zu versuchen, alles zu verspotten, selbst wenn es möglich ist, spöttische Frameworks zu verwenden, um einen Teil des Weges zu finden.

Fragen Sie sich, warum Sie sich verspotten müssen. In der Regel liegt dies an einer fehlenden Abstraktion. Denken Sie an kleine Aufgaben und minimieren Sie die Oberfläche des riesigen, hässlichen ArcObject-Monsters. Vermeiden Sie das Herumziehen von ArcObject-Typen, nur weil ein Teil davon irgendwo benötigt wird.

Ich kann ein konkretes Beispiel aus unserem Projekt geben. Ein Teil des Codes schien von IMxDocument abzuhängen. Es stellte sich heraus, dass der einzige Grund darin bestand, dass die aktive Ansicht aktualisiert werden musste. Also haben wir stattdessen eine IViewRefresher-Schnittstelle erstellt und nur daran gearbeitet. leicht zu verspotten und zu testen. Darüber hinaus wird die Absicht des Codes viel klarer und die Versuchung für jemanden beseitigt, mit dem IMxDocument lustige Dinge zu tun, die er eigentlich nicht tun sollte, weil wir hier nur aktualisieren wollten. Die gleiche Übung kann mit einem Großteil des ArcObjects-Codes durchgeführt werden.

Außerdem haben wir den gesamten Zugriff auf Feature-Classes in typsichere Wrapper eingeschlossen und erneut verspottbaren Code bereitgestellt, der den Geschäftscode vor ArcObjects schützt.

Wir haben nicht einmal die Verwendung der Geometrietypen von ArcObjects erörtert, aber derzeit erlauben wir, dass diese Schnittstellen direkt in unserem Code verwendet werden. (Es sind jedoch nur Schnittstellenkenntnisse zulässig, und alle Instanziierungen von Geometrien verwenden unsere eigene Geometriefabrik.)

Zusammenfassend kann ich sagen, dass ich das Verspotten nicht entmutige, aber ich würde das Verspotten auf einer anderen Abstraktionsebene als ArcObjects fördern.

Cumbayah
quelle
tolle Antwort Cumbayah. Ich habe auch viele Schwierigkeiten beim Testen von AO-Code. Das Beispiel, das Sie gegeben haben, war großartig (IViewRefresher) und ich könnte das auf meine Arbeit hier anwenden. Können Sie weitere Beispiele nennen?
George Silva
Danke Cumbayah. Dies ist, was ich derzeit bei mittleren bis großen Projekten mache und eine separate Assembly erstelle, um die gesamte AO-Implementierung zu abstrahieren. Es ist diese Abstraktion, die ich testen möchte, ohne auf gespeicherte Daten zurückzugreifen, sei es XML-Arbeitsbereiche oder Geodatabases der einen oder anderen Art. Ich stelle fest, dass von Zeit zu Zeit mit unterschiedlichen Daten neue Probleme auftauchen, für die dann Tests erstellt werden müssen, für die zusätzliche Testdaten erforderlich sind. Im Laufe der Zeit habe ich so viele Testdaten für alle Testfälle, dass die Projekte riesig werden, um sie zu verwalten und zu verschieben. Sie können sie von meinem automatisierten Build-Server herunterladen.
BlinkyBill
Cumbayah, das klingt unglaublich. Ich würde gerne einige Beispiele nennen. Haben Sie jemals darüber nachgedacht, auf einer der ESRI-Konferenzen etwas zu diesem Thema zu präsentieren? Ich denke, die ESRI / GIS-Community stirbt für solche Dinge. Ich würde gerne sehen, wie Open Source-Bewegungen zum Testen / Verspotten von ArcObjects gestartet werden.
Keith G
Dies ist ein altes Thema, das ich verstehe, aber gibt es eine Chance, dass wir ein Beispiel Ihrer "eigenen Geometriefabrik" bekommen? Ich versuche, meine Organisation in Richtung Unit-Tests zu bewegen, aber ich werde auf den ArcObjects-Affen aufgehängt.
Luke
4

Unit-Tests für Esri-Entwickler von Dave Bouwman und Brian Noyle sind ein ziemlich guter Ausgangspunkt - vor allem, weil sie Code zum Anschauen herausgeschmissen haben.

bwreilly
quelle
Danke für den Zeiger bwreilly. Was Dave jedoch tut, ist einfach XML-Darstellungen von Features zu verwenden. Während es hilft, ist es immer noch darauf angewiesen, Daten für Tests zu speichern, wovon ich versuche, wegzukommen.
BlinkyBill