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
中使用 MySDK
和 SDKHelper
方法。 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\MySDKTest
的 MyPackage
命名空间中.不一定非得这样——如果您愿意,可以将测试放在不同的命名空间中。
无论如何,它不起作用的原因是您没有使用自动加载器注册测试文件夹。你的东西看起来像当前设置的方式,你的自动加载器配置应该是这样的:
{
"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"] }
}
}
我有以下项目结构
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
中使用 MySDK
和 SDKHelper
方法。 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\MySDKTest
的 MyPackage
命名空间中.不一定非得这样——如果您愿意,可以将测试放在不同的命名空间中。
无论如何,它不起作用的原因是您没有使用自动加载器注册测试文件夹。你的东西看起来像当前设置的方式,你的自动加载器配置应该是这样的:
{
"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"] }
}
}