Composer PSR-4 PHPUnit class 未在同一目录中找到

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 抱怨找不到 class TestUtils

我一直在阅读有关添加 autoload-dev 密钥的信息,我已经尝试了其中的变体,但到目前为止,似乎没有任何效果。我应该澄清一下,我可以在 MySDKTest 中使用 MySDKSDKHelper 方法。 MySDKTest.php 工作时看起来像这样:

use MyPackage\MySDK;

class MySDKTest extends PHPUnit_Framework_TestCase {

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

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

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

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

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

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


备注

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

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

相应地调整命名空间:

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