2013-03-30 2 views
18

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

./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' не найдено

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

+1

Как вы загружаете dir1/File1.php из тестового файла? Операция 'use' не означает, что вам не нужны необходимые файлы. –

+0

Я попытался использовать файл начальной загрузки, который ссылается на Autoload.php, но я не был уверен, какую функциональность использовать для включения всех необходимых файлов. Я также думал, что PHPUnit.xml автоматически включит необходимые файлы в узел ''. Разве это не так? – hohner

+0

Просто попробуйте поместить инструкцию 'require_once' в начале, и она должна работать. –

ответ

3

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

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

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

+2

Вы правы. Но я хочу уйти от ручного указания зависимостей и перейти к более автоматическому решению. Мое решение использует способ сделать это - но в любом случае спасибо :) – hohner

+0

Как ваш путь более автоматизирован? Это выглядит почти так же, как раз с большими накладными расходами. – MichaelRushton

+1

Ну, во-первых, это не обработка разделителей каталогов (для разных ОС), тогда как более полный класс делает. Но вы указали мне в правильном направлении - так что справедливо отметить это как принятое решение. – hohner

2

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

require_once 'SplClassLoader.php'; 

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

+1 для упоминания bootstrap.php.Вот где моя настройка загружает пользовательский автозагрузчик. – akatakritos

+0

Я сделал именно это, но тогда он не может найти классы. Это также, кажется, не рекурсивно входит во все каталоги. – physicalattraction

21

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

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

к composer.json

+0

Я установил phpunit с композитором, и это не решает проблему. Даже используя psr-4 и даже свопинг «your-app-directory» и «» – Leggy7

+0

@ Leggy7 вы можете отправить мне то, что вы пытаетесь использовать – JohnnyFaldo

Смежные вопросы