考虑以下项目布局:
/lib/
Folders/For/Namespaces/SomeClass.php
/test/
Folders/For/Namespaces/SomeClassTest.php
composer.json
来自composer.json
的摘录:
"autoload": {
"psr-4": {
"MyNamespace\\" : "lib/"
}
},
"scripts": {
"test": "phpunit --bootstrap vendor/autoload.php tests"
}
这允许我运行composer test
,其中SomeClassTest.php
将执行\MyNamespace\Folders\For\Namespaces\SomeClass
,自动加载器会找到/test/
Folders/For/Namespaces/SomeClassTest.php
AbstractTest.php
。
在构建抽象测试用例时,我无法进行自动加载:
\MyNamespace\Folders\For\Namespaces\SomeClassTest
此处\MyNamespace\AbstractTest
扩展了composer.json
,但自动加载器找不到此内容。原因很明显,因为在test/
\MyNamespace\AbstractTest
目录中没有链接到命名空间。但是我怎样才能做到这一点?
我尝试将\MyNamespace\Test\AbstractTest
移至composer.json
并将此命名空间添加到"autoload": {
"psr-4": {
"MyNamespace\\" : "lib/",
"MyNamespace\\Test\\" : "test/"
}
},
,如下所示:
{{1}}
但这没有用。我该怎么办?
答案 0 :(得分:1)
如果您只需要某些名称空间用于测试,则可以使用spl_autoload_register
手动自动加载它们。
见http://php.net/manual/de/function.spl-autoload-register.php
对于PHPUnit,我可以创建一个Bootstrap.php,您可以在其中处理自动加载。此代码示例:
spl_autoload_register(function($className) {
$path = str_replace('\\', '/', $className);
$testNs = 'MySeparate/Namespace';
$testNsLength = strlen($testNs);
if(substr($path, 0, $testNsLength) == $testNs) {
include_once '/path/to/src/'.$path.'.php';
}
});
将实现单独命名空间的psr-4自动加载。
答案 1 :(得分:0)
I might be too late for the answer, but still.
Put AbstractTest
class into \MyNamespace\Test
namespace.
That would make it work with your auto-loader configuration:
"autoload": {
"psr-4": {
"MyNamespace\\" : "lib/",
"MyNamespace\\Test\\" : "test/"
}
},
Please use autoload-dev section to define development-time auto-loader configuration:
"autoload": {
"psr-4": {
"MyNamespace\\" : "lib/",
}
},
"autoload-dev": {
"psr-4": {
"MyNamespace\\Test\\" : "test/"
}
},