2010-10-07 14 views
5

To mój phpunit plik testowyphpunit uruchamia test dwa razy - otrzymuje dwie odpowiedzi. Czemu?

<?php // DemoTest - test to prove the point 

function __autoload($className) { 
    // pick file up from current directory 
    $f = $className.'.php'; 
    require_once $f; 
} 

class DemoTest extends PHPUnit_Framework_TestCase { 
    // call same test twice - det different results 
    function test01() { 
     $this->controller = new demo(); 
     ob_start(); 
     $this->controller->handleit(); 
     $result = ob_get_clean(); 
     $expect = 'Actions is an array'; 
     $this->assertEquals($expect,$result); 
    } 

    function test02() { 
     $this->test01(); 
    } 
} 
?> 

Jest to plik badanego

<?php // demo.php 
global $actions; 
$actions=array('one','two','three'); 
class demo { 
    function handleit() { 
     global $actions; 
     if (is_null($actions)) { 
      print "Actions is null"; 
     } else { 
      print('Actions is an array'); 
     } 
    } 
} 
?> 

Powoduje to, że drugi test nie powiedzie się, ponieważ $ działania jest null.

Moje pytanie brzmi - dlaczego nie otrzymam tych samych wyników dla dwóch testów?

Czy to błąd w phpunit, czy to moje rozumienie php?

Odpowiedz

3

PHPUnit ma funkcję zwaną "backup global", jeśli jest włączona, to na początku testu są tworzone kopie zapasowe wszystkich zmiennych w zakresie globalnym (migawka jest tworzona z bieżących wartości) i po zakończeniu każdego testu wartości zostaną przywrócone do pierwotnych wartości. Możesz przeczytać więcej na ten temat tutaj: http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html#content

Teraz spójrzmy na Twój pakiet testowy.

  1. test01 pasuje przygotowuje
  2. zapasowa wykonana jest ze wszystkich zmiennych globalnych (w tym momencie $ działania w zakresie globalnym nie jest ustawiony, ponieważ kod nie został jeszcze ran)
  3. test01 pasuje biegnie
  4. demo. php jest zawarty (dzięki autoloadowi), a $ actions jest ustawione w globalnym zakresie
  5. twoje twierdzenie się powiedzie, ponieważ $ actions jest ustawione w globalnym zasięgu
  6. test01 jest zburzony. zmienne globalne są zwracane do ich pierwotnej wartości. $ działania w zakresie globalnym jest zniszczone w tym momencie, ponieważ został ustawiony wewnątrz test, to nie była częścią państwa globalnego przed rozpoczęciem testu
  7. test02 biegnie .. i zakończy się niepowodzeniem, ponieważ nie ma żadnych działań w skali globalnej.

Bezpośrednie rozwiązanie problemu: dołącz demo.php na początku DemoTest.php, w ten sposób $ actions kończy się globalnym zasięgiem, który jest tworzony i przywracany przed i po każdym teście.

Poprawka długoterminowa: staraj się unikać używania globali. To po prostu zły nawyk i zawsze są lepsze rozwiązania niż globalne państwo używające "globalnego".

+1

Co za znakomita odpowiedź - dziękuję. To sprawia, że ​​teraz. – Ian

Powiązane problemy