Подтвердить что ты не робот

"Класс не найден" при использовании пространств имен в PHPUnit

Я новичок в PHPUnit, и у меня возникли проблемы с настройкой его доступа к моим файлам PHP. Структура каталогов, которую я использую для моего приложения, такова:

./phpunit.xml

./lib/Application/
  -> Dir1/File1.php (namespace = Application\Dir1)
  -> Dir1/File2.php
  -> Dir2/File1.php (namespace = Application\Dir2)

./tests/Application/Tests
  -> Test1.php (namespace = Application\Tests)
  -> Test2.php 

В моем PhpUnit.xml у меня есть:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit verbose="false">
  <testsuites>
      <testsuite name="Application">
          <directory>./tests/Application/Tests</directory>
      </testsuite>
  </testsuites>
  <logging>
       <log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
       <log type="json" target="/tmp/phpunit-logfile.json"/>
  </logging>
  <filter>
        <whitelist>
            <directory suffix=".php">./lib</directory>
        </whitelist>
  </filter>
</phpunit>

И в одном из моих тестовых файлов я открываю с помощью:

namespace Application\Tests;

use Application\Dir1\File1;

class MyTest extends File1 {}

Но он продолжает говорить:

Класс 'Application\Dir1\File1' не найден

Где я иду не так?

4b9b3361

Ответ 1

Даже если вы используете use, вам все равно придется включать файл, используя include, require, include_once или require_once, или используя spl_autoload_register, чтобы включить файл, например:

spl_autoload_register(function ($class)
{
    include '\lib\\' . $class . 'php';
});

При попытке использовать Application\Dir1\File1 script будет автоматически запускаться include '\lib\Application\Dir1\File1.php'

Ответ 2

Если вы установили PHPUnit с помощью Composer, вы можете использовать автозагрузчик Composers. Самый простой способ сделать это - добавить:

"autoload":{
    "psr-0":{
        "your-app-directory":""
    }
}

to composer.json

Ответ 3

Я нашел это действительно полезным класс автозагрузчика от Jonathan Wage, который позволяет PHPUnit проверять доступ к пространствам имен из разных каталогов. В моем bootstrap.php я просто указал пространство имен и связанных модулей:

require_once 'SplClassLoader.php';

$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();