2013-03-30 7 views
18

Sono nuovo in PHPUnit e sto avendo qualche problema nel configurarlo per accedere ai miei file PHP. La struttura di directory che sto usando per la mia app è questo:'Classe non trovata' quando si usano gli spazi dei nomi in 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 

Nel mio phpunit.xml, ho:

<?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> 

E in uno dei miei file di test, apro con:

namespace Application\Tests; 

use Application\Dir1\File1; 

class MyTest extends File1 {} 

Ma continua a dire:

Class 'Application \ Dir1 \ File1' non trovato

Dove sto andando male?

+1

Come si fa a caricare Dir1/File1.php dal vostro file di prova? L'istruzione 'use' non significa che non si debbano richiedere i file necessari. –

+0

Ho provato a utilizzare un file bootstrap che fa riferimento a un Autoload.php, ma non ero sicuro di quale funzionalità utilizzare per includere tutti i file necessari. Ho anche pensato che PHPUnit.xml includesse automaticamente i file richiesti nel nodo ''. Non è questo il caso? – hohner

+0

Basta provare a mettere l'istruzione 'require_once' all'inizio e dovrebbe funzionare. –

risposta

3

Anche se si utilizza use, avete ancora a includere il file, utilizzando include, require, include_once o require_once, oppure utilizzando spl_autoload_register di includere il file, in questo modo:

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

Quando si tenta di utilizzare Application\Dir1\File1 lo script verrà eseguito automaticamente include '\lib\Application\Dir1\File1.php'

+2

Hai ragione. Ma voglio evitare di specificare manualmente le dipendenze e passare a una soluzione più automatizzata. La mia soluzione usa un modo per farlo - ma grazie comunque :) – hohner

+0

Come ti sembra più automatico? Sembra più o meno lo stesso, solo con più overhead. – MichaelRushton

+1

Bene, per esempio, questo non gestisce i separatori di directory (per diversi sistemi operativi), mentre la classe più completa lo fa. Ma tu mi hai indirizzato nella giusta direzione, quindi è giusto che io lo segnali come la soluzione accettata. – hohner

2

ho trovato questo veramente utile class autoloader dal salario Jonathan che permette test PHPUnit a spazi dei nomi di accesso da d directory ifferent. Nel mio bootstrap.php, ho solo specificato la posizione e namespace moduli associati:

require_once 'SplClassLoader.php'; 

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

+1 per menzionare bootstrap.php.Ecco dove la mia installazione carica il caricatore automatico personalizzato. – akatakritos

+0

Ho fatto esattamente questo, ma non riesce a trovare le classi allora. Sembra anche che non ricorra in modo ricorsivo in tutte le directory. – physicalattraction

21

Se è stato installato utilizzando PHPUnit Composer quindi è possibile utilizzare Compositori caricatore automatico. Il modo più semplice per farlo sarebbe quello di aggiungere:

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

a composer.json

+0

Ho installato phpunit con compositore e questo non risolve il problema. Anche usando psr-4 e persino scambiando "directory-app" e "" – Leggy7

+0

@ Leggy7 puoi inviarmi quello che stai cercando di usare – JohnnyFaldo

Problemi correlati