2013-08-21 22 views
30

Używam GHUnit. Chcę przetestować prywatne metody i nie wiem, jak je przetestować. Znalazłem wiele odpowiedzi na pytanie, dlaczego i dlaczego nie przetestować prywatnych metod. Ale nie znalazłem sposobu na ich przetestowanie.Jednostka testująca metodę prywatną - cel C

Nie chciałbym omawiać, czy powinienem przetestować szeregowców, czy nie, ale skupię się na tym, jak go przetestować.

Czy ktoś może podać mi przykład testowania metody prywatnej?

+0

W ten sam sposób, w jaki testujesz normalną metodę, jaki jest dokładnie problem, przed którym stoisz? – Abizern

+0

Decyzja o testowaniu metod prywatnych jest częścią przestrzeni problemu, a nie częścią przestrzeni rozwiązania. – dasblinkenlight

+0

@Abizern Mówi "Brak widocznego @interface dla myClass deklaruje selektor" myMethod'' – Geek

Odpowiedz

86

Metody w Objective-C nie są tak naprawdę prywatne. Komunikat o błędzie, który otrzymujesz, polega na tym, że kompilator nie może zweryfikować, czy wywoływana metoda istnieje, ponieważ nie została zadeklarowana w interfejsie publicznym.

Sposób obejścia tego polega na ujawnieniu prywatnych metod w kategorii klasy, która mówi kompilatorowi, że istnieją metody.

więc dodać coś takiego do górnej części obudowy pliku testowego:

@interface SUTClass (Testing) 

- (void)somePrivateMethodInYourClass; 

@end 

SUTClass jest rzeczywista nazwa klasy piszesz testy dla.

Spowoduje to wyświetlenie Twojej prywatnej metody i możesz ją przetestować bez ostrzeżeń kompilatora.

+0

Ale zrobienie tego ujawni te metody. – Geek

+4

Jeśli robisz to w swojej klasie testowej, ujawniasz tylko metody testów. – Abizern

+0

Ale powiedziałeś, że napisałem to w klasie, którą testuję, a nie w klasie testowej. – Geek

3

Jeśli metoda jest prywatna, nigdy nie należy jej testować.

Pomyśl o tym. Powinieneś przetestować zachowanie i kontrakt swoich metod zamiast wewnętrznej implementacji

+1

Więc ... Jeśli mamy wewnętrzną implementację wymagającą testowania, czy to wskazuje na wadę projektową, w której ta metoda powinna była zostać napisana jako publiczna w innej klasie, która ma być ukryta prywatnie w klasie początkowej? – Mazyod

+2

Jeśli nie, to (powierzchownie) tworzenie aplikacji w jednej klasie prywatnymi metodami nie powinno być testowane. – Mazyod

+0

doskonały Mazyod, całkowicie zgadzam się z Twoimi dodatkowymi informacjami – seufagner

7

Trochę za późno, ale właśnie dostałem się do pociągu TDD.

Prywatne metody nie powinny być testowane. Ponieważ piszesz prywatne metody wspierania twoich publicznych metod, więc testowanie twoich publicznych metod pośrednio testuje prywatne metody, które je wspierają.

zasadzie „metody prywatne nie powinny być badane” jest wspierany przez zasadę „kiedy trzeba testować metod prywatnych, to prawdopodobnie oznacza, że ​​należy przenieść te metody do odrębnej klasy”, czyniąc je do wiadomości publicznej .

+9

Więc to nie jest TDD, jeśli napisałeś kawałek kodu bez uprzedniego napisania testu jednostki. Załóżmy jednak, że twoja metoda publiczna używa kilku prywatnych metod, kiedy nie działa, skąd wiesz, która z nich się nie udała? –

4

uzgodnione z @Lord Zsolt

Również należy pamiętać następnym (od Test-Driven iOS Development ISBN-10: 0-321-77418-3, ISBN-13: 978-0-321-77418-7)

testowanie prywatnych metody

często pytano: „czy mogę przetestować moje metody prywatne?” lub pokrewne pytanie „w jaki sposób należy przetestować moje metody prywatne?” Ludzie pytają o drugie pytanie założyliśmy, że na odpowiedź na pierwszym jest "Tak" i teraz szukają sposobu, aby odsłonić swoje prywatne interfejsy swoich klas w swoich pakietach testowych.

Moja odpowiedź opiera się na obserwacji subtelnego faktu: testowałeś już swoje prywatne metody na . Postępując zgodnie z podejściem red-green-refactor , często w projektowaniu sterowanym testami, zaprojektowałeś publiczne interfejsy API obiektów, aby wykonać pracę, którą te obiekty muszą wykonać.Dzięki tej pracy podanej w testach - - i ciągłej realizacji testów zapewniających, że nie masz nic do załatwienia, możesz swobodnie organizować wewnętrzne kanalizowanie swoich zajęć według własnego uznania. Twoje prywatne metody są już testowane, ponieważ wszystko, co robisz, to refaktoryzacja zachowań, dla których masz już testy.

Nigdy nie powinno się skończyć w sytuacji gdzie prywatna metoda jest niesprawdzone lub niekompletnie zweryfikowany, ponieważ je utworzyć tylko wtedy, gdy widzisz szansę, aby oczyścić realizację metod publicznych. Zapewnia to, że prywatne metody istnieją tylko po to, aby wspierać publiczne zachowanie klasy, i że muszą one być wywoływane podczas testów, ponieważ są one z pewnością określone jako wywołane z publicznych metod.

Powiązane problemy