Почему не загружаются классы автозагрузки пространства имен в тестах phpunit? - PullRequest
3 голосов
/ 19 января 2012

В дополнение к существующему шведскому столу договоренностей между phpunit, autoload и пространством имен это:

Я создал простой тестовый проект, который запускает тесты PhpUnit и использует автозагрузку пространства имен. Я регистрирую автозагрузку в файле начальной загрузки так:

set_include_path(get_include_path() . PATH_SEPARATOR . "/path/to/classes/folder");
spl_autoload_register();

и внутри модульного теста я загружаю и проверяю свой класс так:

$obj = new \some\space\someClass(); // which is in the classes/some/space folder
$this->assertTrue($obj->foo()=='bar');

И я получаю ошибку

Неустранимая ошибка: класс '\ some \ space \ someClass' не найден в testSomeClass.php ...

Ответы [ 2 ]

7 голосов
/ 19 января 2012

Хотя это не относится к phpunit, вам нужно изменить:

spl_autoload_register();

до

spl_autoload_register('spl_autoload');

Любой другой компонент, который регистрирует автозагрузчик, отменяет регистрацию по умолчанию __autoload().

Если ваш код имеет существующую функцию __autoload, то эта функция должна быть явно зарегистрирована в стеке __autoload. Это связано с тем, что spl_autoload_register () эффективно заменит кэш механизма для функции __autoload либо spl_autoload (), либо spl_autoload_call ().

Так вот как spl-autoload работает вместе со всем, что использует автозагрузку.

4 голосов
/ 19 января 2012

Убедитесь, что ваш путь к папке классов указан относительно скрипта, который запускается для выполнения тестов. Если скрипт находится в подпапке ваших проектов (например, tests/), тогда ваш путь должен быть ../path/to/classes/folder

Вот что у меня в tests/bootstrap.php

set_include_path(dirname(__FILE__).'/../classes'.PATH_SEPARATOR.get_include_path());

spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload');
...