23

我是 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

4 回答 4

28

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

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

到 composer.json

于 2014-04-30T21:13:47.380 回答
5

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

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

当你再尝试使用Application\Dir1\File1脚本时会自动运行include '\lib\Application\Dir1\File1.php'

于 2013-03-30T14:15:53.353 回答
3

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

  1. 在 autoload 部分的 composer.json 文件中添加一个带有根命名空间的类映射部分

    "autoload":  {
            "classmap": ["namespaceRoot/"]
    }
    
  2. 执行composer dump-autoload命令以重新创建您的自动加载文件(使用所有类映射!)
于 2019-02-25T08:11:44.733 回答
2

我发现 Jonathan Wage 这个非常有用的类自动加载器允许 PHPUnit 测试从不同目录访问命名空间。在我的 bootstrap.php 中,我刚刚指定了位置和关联的模块命名空间:

require_once 'SplClassLoader.php';

$classLoader = new SplClassLoader('Application', dirname(__FILE__) . '/../lib');
$classLoader->register();
于 2013-03-30T15:06:27.773 回答