2011-09-20 12 views
5

Potrzebuję utworzyć autoloader do mojej aplikacji. Nie chcę polegać na pliku w systemie plików, więc jak mam wyśmiewać nowe połączenie? Lub jak testujesz klasę autoloadera? Dzięki.PHPUnit - test autoloadera klasy

Odpowiedz

1

Utwórz kilka plików klas specjalnie do testowania autoloadera i umieść je w oddzielnym katalogu (test rodzeństwa), który możesz zarejestrować za pomocą autoloadera. Użyj testu class_exists($class, false), aby sprawdzić, czy klasa jest załadowana bez wywoływania autoloadera.

Uwaga: Pomaga jeśli projekt autoloadera być non-static, dzięki czemu można utworzyć wystąpienia osobną instancję do testu zamiast testowania aktywnym.

Oto testy dla metody mojego niestandardowego autoloaderze autoload() jako przykład:

function test_autoload_loadsExistingClass() { 
    $this->fixture->registerPrefix('TestClasses', self::$root . 'models'); 
    if (class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::error('Class TestClasses_Autoloader_Foo is already loaded'); 
    } 
    $this->fixture->autoload('TestClasses_Autoloader_Foo'); 
    if (!class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::fail('Class TestClasses_Autoloader_Foo failed to load'); 
    } 
} 

function test_autoload_silentlyIgnoresMissingClasses() { 
    $this->fixture->registerPrefix('Foo', self::$root . 'models'); 
    $this->fixture->autoload('Foo_Bar'); 
} 

function test_autoload_searchesIncludePathForUnknownPrefix() { 
    if (class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::error('Class TestClasses_Autoloader_Foo is already loaded'); 
    } 
    set_include_path(self::$root . 'include' . PATH_SEPARATOR . self::$savedIncludePath); 
    $this->fixture->autoload('TestClasses_Autoloader_Foo'); 
    if (!class_exists('TestClasses_Autoloader_Foo', false)) { 
     self::fail('Class TestClasses_Autoloader_Foo failed to load'); 
    } 
} 

Aktualizacja: Wow, nie wiem, jak brakowało mi „Nie chcę polegać na plik w systemie plików "w twoim pytaniu, ale to całkiem niezły klucz. Musisz zadzwonić pod numer include w swojej własnej metodzie autoloadera (np. includeFile($path)). Umożliwi to wyśmiewanie metody podczas testu, aby nie dotyczyć plików na dysku. Poza tym testujesz klasę tak, jak zwykle: wprowadzaj dane wejściowe (jak wyżej) klas, które mają być ładowane automatycznie, i sprawdź, czy twoja klasa wywołuje includeFile() z prawidłowymi ścieżkami, kiedy powinna.

function testAutoloadLoadsExistingClass() { 
    $fixture = $this->getMock('MyAutoloader', 
      array('includeFile'), // mock the call to `include` 
      array(...));   // constructor args 
    $fixture->expects($this->once()) 
      ->method('includeFile') 
      ->with('My/Package/Class') 
      ->will($this->returnValue(true)); 
    self::assertTrue($fixture->autoload('My_Package_Class')); 
} 
4

Albo jak można przetestować klasy autoloader

IMHO nie trzeba do jednostki przetestować autoloadera w ogóle.

Jeśli uruchomisz aplikację, będzie to bardzo trudne, ponieważ może znaleźć wszystkie potrzebne klasy lub Twój automatyczny ładownik działa poprawnie.

Każdy test w twoim zestawie testów sprawdzi, czy autoloader jest w stanie załadować "testowaną klasę", więc nie martwiłbym się zbytnio o testowanie tego urządzenia.

Może nazywać to "testowaniem integracyjnym jako efektem ubocznym", jeśli chcesz, ale powiedziałbym, że to wystarczająco dobre.

Jeśli uważasz, że nie jest to wystarczająco dobre, umieściłbym instrukcję require/include w chronionej funkcji i zastąpiłabym tę funkcję w autoloaderze testowym i sprawdź, czy otrzymuje prawidłowe wartości.

+1

+1 za "Testowanie integracyjne jako efekt uboczny". Lubię to. – GordonM

0

Jak testować klasę autoloadera?

Zależy od klasy autoloadera. Na przykład możesz sprawdzić, czy rejestracja automatycznego wywołania zwrotnego zadziałała z spl_autoload_register.

Lub jeśli twój autoloader zapewnia funkcję LoadLibrary, która ładuje wszystkie klasy i interfejsy twojej biblioteki, aby sprawdzić, czy wszystkie klasy zostały załadowane. Ale zwykle zależało to od systemu plików (co moim zdaniem jest w porządku).

Powiązane problemy