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, поэтому я решил самостоятельно написать конфигурацию и файл начальной загрузки.

Ответ 1

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

изменение

<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();

Ответ 2

Вы, вероятно, должны использовать композитор для организации своего кода, например, композитор.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

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

Ответ 3

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

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

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

Ответ 4

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

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