作曲家 PSR-4 PHPUnit 类在同一目录中找不到


Composer PSR-4 PHPUnit class not found in same directory

我有以下项目结构

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.当我尝试从MySDKTest.php调用TestUtils::utilityMethod()时,phpunit抱怨找不到类TestUtils

我一直在阅读有关添加自动加载开发密钥的信息,我已经尝试过的变化,但到目前为止,似乎没有任何效果。我应该澄清一下,我能够在MySDKTest内部使用MySDKSDKHelper方法。 MySDKTest.php工作时看起来像这样:

use MyPackage'MySDK;
class MySDKTest extends PHPUnit_Framework_TestCase {
    public function testPackage() {
        $sdk = new MySDK();
        $sdk->exampleMethod();
    }
}

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

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

无论如何,它不起作用的原因是您没有向自动加载器注册测试文件夹。它看起来像你的东西当前设置的方式,你的自动加载机配置应该看起来像这样:

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

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


注意

您的文件夹结构有点奇怪。我希望test能匹配src.所以它会是这样的:

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

相应地调整命名空间:

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