Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Testowanie, Testowanie - dostep do metod prywatncyh i chronionych
mikowski
post
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". (IMG:http://forum.php.pl/style_emoticons/default/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
mikowski
post
Post #2





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

Posty w temacie


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

 



RSS Aktualny czas: 5.10.2025 - 21:51