Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Testowanie
Forum PHP.pl > Forum > PHP > Object-oriented programming
mikowski
Witam,
Aktualnie zajmuje się testowaniem pewnej klasy i natknąłem się przy tym na pewien problem. A mianowicie jak przetestować metody "private" i "protected".
Z metodami "protected" jest mniejszy problem gdyż jest możliwość utworzenia klasy pochodnej i upublicznienia interfejsu klasy bazowej do testów, czyli :

  1. <?php
  2. class Example {
  3.    protected function methodTest() {
  4.        return false;
  5.    }
  6. }
  7.  
  8. class ExampleExtension extends Example {
  9.    
  10.    public function methodTest() {
  11.        return parent::methodTest();        
  12.    }
  13. }
  14.  
  15. class ExampleTestCase extends PHPUnit_Framework_TestCase {
  16.    protected $_exaple = null;
  17.    
  18.    protected function setUp()
  19.    {      
  20.        $this->_exaple = new ExampleExtension();
  21.        
  22.        parent::setUp();
  23.    }
  24.    
  25.    protected function tearDown()
  26.    {
  27.        $this->_exaple = null;
  28.        
  29.        parent::tearDown ();
  30.    }
  31.    
  32.    public function testMethodTestIsFalse() {
  33.        $this->assertFalse($this->_exaple->methodTest());
  34.    }
  35. }
  36. ?>


Nie ma wiec problemu. A co w przypadku gdy chcemy testować metodę "private". questionmark.gif Próbowałem dostać się do składowych poprzez Reflection API, ale niestety i ono ma ograniczone pole działania :/ konstrukcje z getClosure() działają tylko z metodami statycznymi.
Pozdrawiam
wookieb
Dopisujesz publiczna metodę testową...
mike
Metod chronionych i prywatnych nie testuje się bezpośrednio.
Musisz napisać taki test metod publicznych, który zapewni przetestowanie również metoch niepublicznych.

Pokrycie kodu testami musi byc jak największe.
dr_bonzo
Jak wyzej. Testujesz tylko metody publiczne, innych (tzn prywatnych i protected) "nie masz" - one sa wytworem refaktoryzacji, powstaly wydzielone z metod publicznych tak zeby kod byl czytelniejszy. Refaktoryzacja wymaga posiadania testow (tzn dobrze by bylo gdyby miec te testy - jest latwiej).
Zaczynasz testowac duza metode publiczna, wydaje ci sie za dluga, te linijki robia to samo co w drugiej metodzie obok - wydzielasz wspolny kod do metody prywatnej. Wydzielasz fragmenty kodu odpowiedzialne za jedna tematycznie rzecz do osobnej metody - prywatnej, itd.


Tzn taka jest teoria, jesli zaczynasz od testow a potem metod publicznych to ci wszystko ladnie sie pouklada. i OOP to interfejsy a nie bebechy - a interfejsem sa TYLKO publiczne metody
mikowski
Dokładnie rozumiem ze OOP to interfejsy i ze klient widzi tylko publiczny interfejs. Chodziło mi po prostu o unikniecie pośredniego testowania i możliwość utworzenia w teście bezpośredniego testowania metod protected lub private (nie chce tutaj skłamać i konfabulować ale gdzieś mi się obiło o oczy takie możliwości np w Junicie czyli fremeworku testowym dla javy, ale tutaj mogę się głęboko mylić więc mnie skorygujcie).
Bardzo podoba mi się jednak koncepcja testowania pośredniego i tak skonstruowania metody testowej aby sprawdzała ona od razu metodę prywatną lub chronioną.
Niekiedy jednak przydałaby by się możliwość za pomocą chociażby Reflection API sięgnięcia do metod chronionych i przetestowania jej bezpośrednio (bez zmian interfejsu klasy).

Moje pytanie poniekad nasunelo mi sie tez w wyniku testpwania Reflection API, ktore umozliwia dostep do metod statycznych (private, protected, public) i zwrot z nich wartosci. Natomiast juz nie umozliwia dostepu do niestatycznych metod. Newiem dlaczego tak jest bo jeszcze tego nie odnalazlem w dokumentacji, ale z grubsza wydaja mi sie to troche niekonsekwentne Przyklad ponizej:

  1. <?php
  2. class Example {
  3.    static protected function printerProtected () {
  4.        echo "Jestem statyczna chroniona metoda\n";
  5.    }
  6.    
  7.    static private function printerPrivate () {
  8.        echo "Jestem statyczna prywatna metoda\n";
  9.    }
  10.    
  11.    public function printer () {
  12.            echo "Jestem publiczna nie statyczna metoda ktora sie nie wykona ERROR FATAL !!!\n";
  13.    }
  14. }
  15.  
  16. try {
  17. $class = new ReflectionClass('Example');
  18. $method = $class->getMethod('printerProtected');
  19. $closureFirst = $method->getClosure();
  20.  
  21. $closureFirst();
  22.  
  23. $class = new ReflectionClass('Example');
  24. $method = $class->getMethod('printerPrivate');
  25. $closureSecond = $method->getClosure();
  26.  
  27. $closureSecond();
  28.  
  29. echo Example::printerPrivate(); //Fatal error
  30.  
  31. $class = new ReflectionClass('Example');
  32. $method = $class->getMethod('printer');
  33. $closure = $method->getClosure();
  34.  
  35. $closure(); //Fatal error
  36.  
  37.  
  38. }
  39. catch(Exception $e) {
  40.    echo "Wyjatek";
  41. }
  42. ?>


Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.