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

hoh*_*ner 22 php phpunit namespaces

我是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 
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

在我的一个测试文件中,我打开:

namespace Application\Tests;

use Application\Dir1\File1;

class MyTest extends File1 {}
Run Code Online (Sandbox Code Playgroud)

但它继续说:

找不到类'Application\Dir1\File1'

我哪里错了?

Joh*_*ldo 26

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

"autoload":{
    "psr-0":{
        "your-app-directory":""
    }
}
Run Code Online (Sandbox Code Playgroud)

到composer.json

  • 请提及使用“ composer dump-autoload” (2认同)

Mic*_*ton 5

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

spl_autoload_register(function ($class)
{
    include '\lib\\' . $class . 'php';
});
Run Code Online (Sandbox Code Playgroud)

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

  • 你是对的。但我想摆脱手动指定依赖项并转向更自动化的解决方案。我的解决方案使用了一种方法 - 但无论如何还是谢谢:) (3认同)