Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Testowanie, Testowanie - dostep do metod prywatncyh i chronionych
mikowski
post 28.11.2008, 11:15:22
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 7.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
wookieb
post 28.11.2008, 11:16:42
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dopisujesz publiczna metodę testową...

Ten post edytował wookieb 28.11.2008, 11:17:57


--------------------
Go to the top of the page
+Quote Post
mike
post 28.11.2008, 11:23:39
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
dr_bonzo
post 28.11.2008, 13:32:18
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
mikowski
post 28.11.2008, 18:02:20
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 7.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.06.2025 - 06:09