用于从单独目录进行测试的自动加载类

时间:2015-11-20 12:06:55

标签: phpunit composer-php

考虑以下项目布局:

/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}}

但这没有用。我该怎么办?

2 个答案:

答案 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.

Solution for the problem

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/"
    }
},

Development-time auto-loader

Please use autoload-dev section to define development-time auto-loader configuration:

"autoload": {
    "psr-4": {
        "MyNamespace\\" : "lib/",
    }
},
"autoload-dev": {
    "psr-4": {
        "MyNamespace\\Test\\" : "test/"
    }
},