Je suis nouveau sur PHPUnit et j'ai du mal à le configurer pour accéder à mes fichiers PHP. La structure de répertoire que j'utilise pour mon application est la suivante:
./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
Dans mon PhpUnit.xml, j'ai:
<?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>
Et dans l'un de mes fichiers de test, j'ouvre avec:
namespace Application\Tests;
use Application\Dir1\File1;
class MyTest extends File1 {}
Mais il continue de dire:
Classe 'Application\Dir1\File1' introuvable
Où est-ce que je vais mal?
Même si vous utilisez use
, vous devez toujours inclure le fichier, soit en utilisant include
, require
, include_once
, ou require_once
, ou en utilisant spl_autoload_register
pour inclure le fichier, comme ceci:
spl_autoload_register(function ($class)
{
include '\lib\\' . $class . 'php';
});
Lorsque vous essayez ensuite d'utiliser Application\Dir1\File1
le script s'exécutera automatiquement include '\lib\Application\Dir1\File1.php'
Si vous avez installé PHPUnit en utilisant Composer alors vous pouvez utiliser le chargeur automatique Composers. La façon la plus simple de le faire serait d'ajouter:
"autoload":{
"psr-0":{
"your-app-directory":""
}
}
à composer.json
J'ai trouvé cela très utile chargeur automatique de classe par Jonathan Wage qui permet aux tests PHPUnit d'accéder aux espaces de noms à partir de différents répertoires. Dans mon bootstrap.php, je viens de spécifier l'emplacement et l'espace de noms des modules associés:
require_once 'SplClassLoader.php';
$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();
J'ai eu le même problème. J'utilise composer également et la seule chose qui l'a résolu pour moi était la suivante:
ajouter à votre fichier composer.json dans la section de chargement automatique une section de carte de classe avec votre espace de noms racine
"autoload": {
"classmap": ["namespaceRoot/"]
}
composer dump-autoload
commande afin de recréer vos fichiers de chargement automatique (avec tous les mappages de classe!)