我是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'
我哪里错了?
答案 0 :(得分:26)
如果您使用Composer安装了PHPUnit,则可以使用Composers自动加载器。最简单的方法是添加:
"autoload":{
"psr-0":{
"your-app-directory":""
}
}
到composer.json
答案 1 :(得分:3)
即使您使用use
,仍然必须使用include
,require
,include_once
或require_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)
我有同样的问题。 我也在使用作曲家,为我解决的唯一问题是:
将具有根名称空间的类映射部分添加到autoload部分的composer.json文件中
"autoload": {
"classmap": ["namespaceRoot/"]
}
composer dump-autoload
命令以重新创建您的自动加载文件(带有所有类映射!)