Jak testować jednostki ArcObjects za pomocą Mocking?

10

Jestem wielkim fanem testów jednostkowych, ale nadal korzystam z FGDB, aby pobrać funkcje do uruchamiania testów jednostkowych podczas korzystania ze środowiska ArcObjects.

Czy ktoś z powodzeniem stosuje drwiny z myśli takich jak IFeature, IGeometry, IWorkspace itp. Jeśli tak, chciałbym zobaczyć kilka przykładów tego, jak to robisz. Naprawdę nie obchodzi mnie, z jakich frameworków korzystasz, po prostu zobaczenie, jak to robisz, byłoby bardzo mile widziane.

Problem, jaki widzę, polega na tym, że musisz kroić i kroić kostkę między tyloma interfejsami na tym samym obiekcie, że narzut związany z tworzeniem reprezentatywnego obiektu próbnego byłby ogromny.

BlinkyBill
źródło
Każdy, kto może nie wiedzieć o kpinie (jak ja), zapoznaj się z tym linkiem. Interesujące rzeczy. stackoverflow.com/questions/300177/…
Simon

Odpowiedzi:

14

W dużym projekcie udało nam się całkiem dobrze oddzielić kod ArcObjects od naszej logiki biznesowej. Jest to ogólnie rzecz biorąc droga, którą powinienem powiedzieć, zamiast próbować wyśmiewać to wszystko, nawet jeśli jest to możliwe przy użyciu ramek próbnych, aby uzyskać trochę drogi.

Zadaj sobie pytanie, dlaczego czujesz potrzebę kpienia. Zazwyczaj dzieje się tak z powodu braku abstrakcji. Pomyśl o drobnych obowiązkach i zminimalizuj powierzchnię ogromnego, brzydkiego potwora ArcObject. Unikaj przeciągania wokół typów ArcObject tylko dlatego, że gdzieś potrzebny jest jakiś ich aspekt.

Mogę podać jeden konkretny przykład z naszego projektu. Część kodu zdawała się zależeć od IMxDocument. Okazało się, że jedynym powodem było odświeżenie aktywnego widoku. Zamiast tego stworzyliśmy interfejs IViewRefresher i pracowaliśmy tylko nad tym; łatwe do wyśmiewania i testowania. Dodatkowo sprawia, że zamiar kodu jest znacznie bardziej przejrzysty i usuwa pokusę, aby ktoś zaczął robić śmieszne rzeczy z IMxDocument, których nie powinni robić, ponieważ wszystko, co chcieliśmy zrobić, to odświeżenie. To samo ćwiczenie można wykonać z dużą ilością kodu ArcObjects.

Ponadto zawarliśmy cały dostęp do klas elementów w bezpiecznych opakowaniach typu, ponownie zapewniając kod możliwy do wyzerowania, chroniąc kod biznesowy przed ArcObjects.

Omówiliśmy nawet nieużywanie typów geometrycznych ArcObjects, ale obecnie zezwalamy na używanie tych interfejsów bezpośrednio w naszym kodzie. (Dozwolona jest jednak tylko znajomość interfejsu i wszystkie instancje geometrii korzystają z naszej własnej fabryki geometrii).

Podsumowując, nie zniechęcam do kpin, ale zachęcam do kpin na innym poziomie abstrakcji niż ArcObjects.

Cumbayah
źródło
świetna odpowiedź Cumbayah. Mam też wiele trudności z testowaniem kodu AO. Podany przez ciebie przykład był świetny (IViewRefresher) i mógłbym zastosować to do mojej pracy tutaj. Czy możesz podać dalsze przykłady?
George Silva,
Dzięki Cumbayah. Tak właśnie robię w średnich i dużych projektach, tworząc osobny zestaw, aby wyodrębnić całą implementację AO. Jest to abstrakcja, którą chciałbym przetestować bez uciekania się do przechowywanych danych, niezależnie od tego, czy są to obszary robocze XML czy geobazy tego rodzaju. Uważam, że od czasu do czasu przy różnych danych pojawiają się nowe problemy, które wymagają stworzenia testów, co wymaga dodatkowych danych testowych. Z biegiem czasu mam tak dużo danych testowych dla wszystkich przypadków testowych, że projekty stają się ogromne do zarządzania i przenoszenia, pozwalając na pobieranie przez mój automatyczny serwer kompilacji.
BlinkyBill
Cumbayah, to brzmi niesamowicie. Chciałbym podać kilka przykładów. Czy zastanawiałeś się kiedyś nad prezentowaniem czegoś na ten temat na jednej z konferencji ESRI? Myślę, że społeczność ESRI / GIS umiera za tego rodzaju rzeczy. Chciałbym zobaczyć, jak zaczyna się ruch open source do testowania / wyśmiewania ArcObjects.
Keith G,
Rozumiem, że to stary temat, ale czy jest szansa, że ​​zdobędziemy próbkę „własnej fabryki geometrii”? Próbuję zmusić moją organizację do przejścia w kierunku testów jednostkowych, ale rozłącza mnie małpa ArcObjects.
Łukasz
4

Testy jednostkowe dla deweloperów Esri autorstwa Dave'a Bouwmana i Briana Noyle'a to całkiem dobre miejsce startowe - zwłaszcza, że ​​rzucili trochę kodu, aby obejrzeć.

bwreilly
źródło
Dzięki za wskaźnik bwreilly. To, co robi Dave, to po prostu użycie reprezentacji XML funkcji. Więc chociaż pomaga, wciąż polega na przechowywaniu danych do testów, od tego właśnie staram się uciec.
BlinkyBill