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
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'));
}
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.
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).
- 1. Funkcja autoloadera PHP vs. funkcja autoloadera proceduralnego?
- 2. Ponownie uruchom ostatni nieudany test w PHPUnit
- 3. Metody klasy skrótowej PHPUnit zadeklarowane jako "ostateczne"
- 4. Jednostka testowania klasy usług symfony z PHPUnit
- 5. Z klasy PHPUnit "mysqli" nie został znaleziony
- 6. Jak wskazać, że test PHPUnit zakończy się niepowodzeniem?
- 7. phpunit uruchamia test dwa razy - otrzymuje dwie odpowiedzi. Czemu?
- 8. nie można uruchomić pojedynczy test z dostawcą danych w PHPUnit
- 9. Co PHPUnit ignorować rzeczy?
- 10. PHPUnit i Globals
- 11. Dziwna wydajność z PHPUnit
- 12. Błąd PHPUnit w Symfony2
- 13. Mocking/stubbing obiekt klasy, która implementuje ArrayAccess w PHPUnit
- 14. PHPUnit: Pobierz nazwę klasy testowej i metody z setUp()?
- 15. Kod PHPUnit Coverage
- 16. PHPunit - Błędy
- 17. PHPUnit Code Coverage & Wyjątki
- 18. wybrać opcję z selenium2 + PHPUnit
- 19. Usługi PHPUnit i ZF2
- 20. PhpUnit ... Killed Dlaczego został zabity?
- 21. Testowanie bazy danych PHPUnit
- 22. Skrypt w ścieżce zależności zależności od autoloadera Composer
- 23. Funkcja testowa mt_rand z PHPUnit
- 24. klasy PHP problem rozwiązać dla klas w tym samym katalogu, gdy uruchomiony phpunit przypadków testowych
- 25. przekazywanie niestandardowego php.ini do phpunit
- 26. Testowanie danych wejściowych w PHPUnit
- 27. PHPunit nie może znaleźć testów
- 28. Usterka PHPUnit podczas sesji Symfony2
- 29. Jak uruchomić test selekcji PHPUnit bez konieczności uruchamiania nowego okna przeglądarki dla każdej funkcji?
- 30. Okna Instalacja PHPUnit poprzez PEAR - Instalacja PHPUnit poprzez PEAR
+1 za "Testowanie integracyjne jako efekt uboczny". Lubię to. – GordonM