2009-06-29 20 views
5

Próbuję zmienić moje testy jednostkowe ArcGIS i zacząć używać makiet (ja używam nosorożca).
Kiedy zacząłem pisać testy, zauważyłem, że muszę zacząć kpić z wielu obiektów i stosować wiele metod nawet dla pojedynczego testu.
Na przykład - mój pierwszy kontroler dostaje RelationshipClass (tak muszę skrótową z IWorkspace i wracającą IRelationshipClass), a następnie pobiera również IFeature (stub), a na końcu nazywa stubRelClass.GetRelatedObjects(stubFeature), aby zwrócić ISet pozostałych IFeatures.jednostka zapach testowy

Czy to normalne, że trzeba wyczarować tak wiele obiektów i metod, aby je przekazać? Czuję też, że naprawdę potrzebuję przejść przez kod (tak - wiem, że powinienem napisać testy najpierw, wciąż próbuję tego), aby dowiedzieć się, co dalej i co powinienem zwrócić .

Mam również problem z kpiącymi klasami com, które implementują więcej niż jeden interfejs. W kodzie produkcji I QI je między interfejsami. Jak utworzyć symulację, która implementuje oba interfejsy w czasie wykonywania?

Odpowiedz

3

W zależności od łańcucha wstrzykiwania, tak, czasami trzeba kpić z wielu przedmiotów. Jeśli jednak robisz wiele poziomów, może to wskazywać na błąd projektowy - obiekty, które opierają się na danych, które są trzy warstwy w interfejsie API, mogą nie być luźno powiązane. Powinieneś być w stanie zdusić łańcuch w zarodku, zwracając fałszywy obiekt w pewnym momencie, który ma niezbędne właściwości, które warstwa testuje w razie potrzeby.

Powinieneś być w stanie wykonać większość z kpiny w metodzie [SetUp], a następnie każdy test wystarczy zmienić jedną lub dwie rzeczy.

Do kpiny z wielu interfejsów, Rhino ma koncepcję MultiMock. Wierzę, że jesteś po składnia jest:

var mock = 
    MockRepository.DynamicMultiMock<MyType>(
       typeof(Interface1), 
       typeof(Interface2), 
       ....); 
+0

O wprowadzenie do obiektu, który przecina głębokie poziomy - będzie to „save” mnie od szydząc trochę więcej obiektów (od tego jednego obiektu obejmie dla nich), ale to wciąż trzeba kpić o taka sama ilość metod, prawda? Czy mam to źle? –

+0

Nie chodzi o to, aby "uratować cię" przed kpiną z większej ilości przedmiotów. Chodzi o to, że test próbuje ci powiedzieć, że jest tam brakująca koncepcja, dlatego jest tak skomplikowana. –

2

Dla mnie to brzmi jak kod nietestowalna, który jest zapach :-(

Polecam czytanie http://misko.hevery.com/code-reviewers-guide/ Autor jest trener odpowiedzialny za nauczanie google. W tym artykule pokazuje, w jaki sposób można napisać testowalny i nietrwały kod:

Dalszy zalecany odczyt: Czysty kod (Robert C. Martin) - główny nacisk na to, jak pisać czysto (co odpowiada testowalnym) kod Efektywna praca ze starszym kodem (Michael Feather) - pokazuje sposoby na przetestowanie nieprzetestowanego i niesprawdzalnego kodu.

+0

i jeśli nie masz nic przeciwko krótkiej reklamie ... http://www.mockobjects.com/book –

3

Może to być oznaką wysokiego sprzężenia - co z kolei oznacza konieczność zmniejszenia zależności (co poprawi konstrukcję i testowalność). Jako przybliżoną wskazówkę, obiekt powinien mieć maksymalnie 4-6 współpracowników. Wszystko ponad to uruchomiłoby moje alarmy.

How are Mocks meant to be used?