从单独的目录中自动加载测试类



考虑以下项目布局:

/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自动加载。

相关内容

  • 没有找到相关文章

最新更新