PHPUnit – классы автозагрузки в тестах

У меня есть следующая структура в рамках моего проекта:

/ /app /app/models/ --UserTable.php /lib /lib/framework /lib/framework/Models /lib/framework/Db /tests -- phpunit.xml, bootstrap.php /tests/app /tests/app/models --UserTableTest.php 

В каталогах приложений и lib у меня есть разные классы, которые работают вместе для запуска моего приложения. Чтобы настроить мои тесты, я создал файл /tests/phpunit.xml и /tests/bootstrap.php

phpunit.xml

 <phpunit bootstrap="bootstrap.php"> </phpunit> 

bootstrap.php

 <?php function class_auto_loader($className) { $parts = explode('\\', $className); $path = '/var/www/phpdev/' . implode('/', $parts) . '.php'; require_once $path; } spl_autoload_register('class_auto_loader'); 

Поэтому у меня есть следующий тест:

 <?php class UserTableTest extends PHPUnit_Framework_TestCase { protected $_userTable; public function setup() { $this->_userTable = new app\models\UserTable; } public function testFindRowByPrimaryKey() { $user = $this->_userTable->find(1); $this->assertEquals($user->id, 1); } } 

Но он не может найти класс при запуске теста. PHP Fatal error: Class 'app\models\UserTable' not found in /var/www/phpdev/tests/app/models/UserTableTest.php on line 13

Что я делаю не так? Я пытаюсь лучше понять конфигурацию PHPUnit, поэтому я решил самостоятельно написать конфигурацию и файл начальной загрузки.

Если вы используете автозагрузку композитора

изменение

<phpunit colors="true" strict="true" bootstrap="vendor/autoload.php">

в

<phpunit colors="true" strict="true" bootstrap="tests/autoload.php">

и в tests каталоге создайте новый autoload.php со следующим контентом

 include_once __DIR__.'/../vendor/autoload.php'; $classLoader = new \Composer\Autoload\ClassLoader(); $classLoader->addPsr4("Your\\Test\\Namespace\\Here\\", __DIR__, true); $classLoader->register(); 

Если вы загружаете классс с тем же загрузочным приложением в приложение, вы должны иметь возможность загружать их в тесте. Если вы запускаете тест cd в свой тестовый каталог, просто добавьте его в свой phpunit.xml:

 <testsuite name="My Application Tests"> <directory>./</directory> </testsuite> 

Внутри <phpunit></phpunit>

Вы, вероятно, должны использовать композитор для организации своего кода, например, композитор.json в корневой директории проекта должен содержать что-то вроде:

  ... "autoload": { "psr-0": { "PRJ_NAME\\APP\\": "app/", "PRJ_NAME\\LIB\\": "lib/" } }, ... 

Затем, после выполнения обновления композитора, два пространства имен, определенные выше, помещаются в каталог vendor / composer / autoload_namespaces.php. Далее просто, просто запустите phpunit с опцией автозагрузки следующим образом:

 phpunit --bootstrap vendor/autoload.php tests/app/models/UserTableTest 

Убедитесь, что вы используете свое пространство имен как в своем исходном коде, так и в тестовом коде.

В моем загрузчике (очень близко к вашему) я проверяю, является ли первая взорванная часть имени класса моим поставщиком , если это не тот, что загрузчик просто ничего не делает (ничего не случилось с загрузчиком phpunit , поскольку я новичок phpunit и не знаю, является ли это ожидаемым поведением, или если phpunit предлагает или обеспечивает загрузчик, готовый к использованию).

Я сохраняю phpunit.xml в том же каталоге tests/ (не внутри) и после настройки <directory>tests</directory> Я просто запускаю phpunit в командной строке без параметров конфигурации или каталога.