在PHPUnit中使用名称空间时“找不到类”

时间:2013-03-30 13:53:27

标签: php namespaces 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'

我哪里错了?

4 个答案:

答案 0 :(得分:26)

如果您使用Composer安装了PHPUnit,则可以使用Composers自动加载器。最简单的方法是添加:

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

到composer.json

答案 1 :(得分:3)

即使您使用use,仍然必须使用includerequireinclude_oncerequire_once来包含该文件,或者通过使用spl_autoload_register来包含文件,如下所示:

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

当您尝试使用Application\Dir1\File1时,脚本将自动运行include '\lib\Application\Dir1\File1.php'

答案 2 :(得分:2)

我发现Jonathan Wage非常有用class autoloader,它允许PHPUnit测试从不同的目录访问命名空间。在我的bootstrap.php中,我只是指定了位置和关联的模块命名空间:

require_once 'SplClassLoader.php';

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

答案 3 :(得分:0)

我有同样的问题。 我也在使用作曲家,为我解决的唯一问题是:

  1. 将具有根名称空间的类映射部分添加到autoload部分的composer.json文件中

    "autoload":  {
            "classmap": ["namespaceRoot/"]
    }
    
  2. 执行composer dump-autoload命令以重新创建您的自动加载文件(带有所有类映射!)