Composer PSR-4 PHPUnit类在同一目录中找不到

时间:2016-07-06 03:07:37

标签: php phpunit composer-php autoload psr-4

我有以下项目结构

src/
   ├─ MyPackage/
               ├─ MySDK.php
               └─ SDKHelper.php
test/
    ├─ MySDKTest.php
    └─ TestUtils.php
composer.json
composer.lock

我的composer.json文件如下所示:

"autoload": {
    "psr-4": {
        "MyPackage\\": "src/MyPackage"
    }
}

一切都运行良好,并且MySDKTest.php单元测试正在通过,直到我尝试将一些实用程序方法添加到第三个文件TestUtils.php。当我尝试从TestUtils::utilityMethod()拨打MySDKTest.php时,phpunit会抱怨找不到班级TestUtils

我一直在阅读有关添加autoload-dev密钥的信息,我尝试过这些密钥,但到目前为止,似乎没有任何工作。我应该澄清一下,我可以在MySDK内使用SDKHelperMySDKTest方法。 MySDKTest.php工作时看起来像这样:

use MyPackage\MySDK;

class MySDKTest extends PHPUnit_Framework_TestCase {

    public function testPackage() {
        $sdk = new MySDK();
        $sdk->exampleMethod();
    }
}

1 个答案:

答案 0 :(得分:1)

应该很简单。 Composer的PSR-4自动加载器只定义了从命名空间到文件夹的映射。

您的测试是否正确命名空间?看起来他们不是因为你的测试类顶部有use。如果MySDK位于名称空间MyPackage(完全限定MyPackage\MySDK),我希望MySDKTest也位于MyPackage MyPackage\MySDKTest命名空间中。它不一定是那样 - 如果你愿意,可以将测试放在不同的命名空间中。

无论如何,它不起作用的原因是您没有使用自动加载器注册测试文件夹。当前设置你的东西的方式,你的自动加载器配置应如下所示:

{
    "autoload": {
        "psr-4": { "MyPackage\\": ["src/MyPackage/", "test/"] }
    }
}

此外,您还需要在测试类中将use MyPackage\MySDK;更改为namespace MyPackage;

注意

你的文件夹结构有点奇怪。我希望testsrc匹配。所以它会是这样的:

test/
    ├─ MyPackage/
        ├─ MySDK.php
        └─ SDKHelper.php

相应地调整命名空间:

{
    "autoload": {
        "psr-4": { "MyPackage\\": ["src/MyPackage", "test/MyPackage"] }
    }
}