web-dev-qa-db-fra.com

'Classe introuvable' lors de l'utilisation d'espaces de noms dans PHPUnit

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?

22
hohner

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'

4
MichaelRushton

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

26
JohnnyFaldo

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

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:

  1. 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/"]
    }
    
  2. exécuter composer dump-autoload commande afin de recréer vos fichiers de chargement automatique (avec tous les mappages de classe!)
2
silver