考虑以下项目布局:
/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
和其他MyNamespaceFoldersForNamespacesSomeClass
。
然而,当构建一个抽象的测试用例时,我无法让自动加载工作:
/test/
Folders/For/Namespaces/SomeClassTest.php
AbstractTest.php
这里MyNamespaceFoldersForNamespacesSomeClassTest
扩展了MyNamespaceAbstractTest
,但自动加载器找不到它。原因是显而易见的,因为在composer.json
中,test/
目录没有链接到命名空间。但是我该怎么做呢?
我尝试将MyNamespaceAbstractTest
移动到MyNamespaceTestAbstractTest
,并将此命名空间添加到composer.json
,如下所示:
"autoload": {
"psr-4": {
"MyNamespace\" : "lib/",
"MyNamespace\Test\" : "test/"
}
},
但这无济于事。我该怎么办?
我可能来不及回答,但仍然如此。
问题的解决方案
将AbstractTest
类放入MyNamespaceTest
命名空间中。这将使它与您的自动加载器配置一起工作:
"autoload": {
"psr-4": {
"MyNamespace\" : "lib/",
"MyNamespace\Test\" : "test/"
}
},
开发时间自动装载机
请使用autoload-dev部分定义开发时间自动加载器配置:
"autoload": {
"psr-4": {
"MyNamespace\" : "lib/",
}
},
"autoload-dev": {
"psr-4": {
"MyNamespace\Test\" : "test/"
}
},
如果您的测试只需要一些名称空间,则可以使用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自动加载。