![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 60 Dołączył: 25.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
Testy jednostkowe w PHPUnit i PHP 5.3.
Mam następujące klasy (oczywiście to schemat z jedynie kluczowymi elementami kodu):
Teraz chodzi o to, że chcę przetestować czy FirstClass::testedMethod zwraca poprawne dane, bo jest to metoda uzywana przez kilka metod publicznych klasy FirstClass i to w niej zawarta jest istotna funkcjonalnosc logiczna. Pozostale metody wywolujace testedMethod w zasadzie jedynie przetwarzaja i dekoruja wynik zwrocony z testedMethod(). Problem w tym, ze musze zamokować metodę SecondClass::getValue, bo w warunkach testowych zupelnie odpada jej uzycie: odwoluje sie do zewnetrznych zasobow niedostepnych w srodowisku testowym, jest zlozona, zwraca nieprzewidywalne wyniki itd. - wiadomo o co chodzi (IMG:style_emoticons/default/smile.gif) Wszystko bylo by proste, gdyby metoda FirstClass::testedMethod() byla publiczna - ale jest prywatna i chce, zeby taka pozostala. Czy można w PHPUnit przetestować bezpośrednio testedMethod() dla różnych podanych parametrów z jednoczesnym mockiem na metodę SecondClass::getValue, która ma zwracać stałą wartość? Czy to jest w ogóle możliwe? Wiem jak: - testować metody prywatne/chronione (za pomocą refleksji) ale bez użycia mocka (w tym przypadku na SecondClass::getValue()) - jak testować publiczną metodę FirstClass::testedMethod() z mockowanym wywołaniem SecondClass::getValue(). Ale nie potrafię zrobić tego gdy testedMethod jest prywatna a muszę mieć zamockowane użycie SecondClass:getValue(). Da się? Jak? Ten post edytował irmidjusz 10.09.2012, 22:10:42 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Testowanie prywatnych metod trochę mija się z celem, ponieważ tak na prawdę co powinieneś testować to interfejs jaki daje Tobie obiekt czyli metody publiczne, ale jeżeli na prawdę chcesz testować tę metodę prywatną to moim zdaniem najlepszy rozwiązaniem będzie stworzenie dodatkowej klasy (tylko na potrzeby testowania) która będzie rozszerzać FirstClass i dodać metodę publiczną która będzie metodą proxy dla testedMethod. Jest to trochę brudne rozwiązanie ale na tę chwilę nic innego nie przychodzi mi do głowy (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 279 Pomógł: 60 Dołączył: 25.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
Testowanie prywatnych metod trochę mija się z celem, ponieważ tak na prawdę co powinieneś testować to interfejs jaki daje Tobie obiekt czyli metody publiczne Zgadzam się (IMG:style_emoticons/default/smile.gif) Ale w drodze wyjątku tę prywatną metodę także chciałem przetestować ze względu na jej specyficzną rolę i zwracane dane. Myślałem też o takim podejściu, jakie zaproponowałeś, znalazłem m.in. http://www.phpclasses.org/package/5659-PHP...te-members.html - może się komuś przyda. Ale ostatecznie poradziłem sobie inaczej i w sumie poprawniej - wydzieliłem część kodu owej testedMethod do osobnej prywatnej metody i dało się przetestować wszystko na czym mi zależało. A przy okazji obie te metody są teraz czytelniejsze i prostsze, bo każda wykonuje oddzielne, specyficzne zadanie. Zasada jednej odpowiedzialności znowu okazała się słuszna (IMG:style_emoticons/default/smile.gif) Ten post edytował irmidjusz 11.09.2012, 23:03:02 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 22:01 |