为什么在通过 PhpUnit 进行 运行 测试时找不到我的自定义 TestCase class?
Why is my custom TestCase class not being found when running tests through PhpUnit?
我按照 documentation 中的描述将 PHPUnit 添加到我的 Symfony 项目中。创建和 运行 第一个扩展 Symfony\Bundle\FrameworkBundle\Test\WebTestCase
的测试没问题。
现在我想创建一个自定义 WebTestCase
subclass,它为其他测试提供通用功能 classes:
// .../projectDir/tests/BaseTestCase.php
namespace My\Project\Tests;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class BaseTestCase extends WebTestCase {
protected function doSomething() {}
}
// .../projectDir/tests/SomeTest.php
namespace My\Project\Tests;
use My\Project\Tests\BaseTestCase;
class SomeTest extends BaseTestCase {
protected function testSomething() {
$this->doSomething();
...
}
}
当 运行 php bin/phpunit
我收到“Class 未找到”错误:
$ php bin/phpunit
PHP Fatal error: Uncaught Error: Class 'My\Project\Tests\BaseTestCase' not found in /path/to/projectDir/tests/SomeTest.php:6
Stack trace:
#0 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(65): include_once()
#1 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(49): PHPUnit\Util\FileLoader::load('/path/to/...')
#2 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(402): PHPUnit\Util\FileLoader::checkAndLoad('/path/to/...')
#3 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(530): PHPUnit\Framework\TestSuite->addTestFile('/path/to/...')
#4 /path/to/projectDir/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php(67): PHPUnit\Framework\TestSuite->addTestFiles(Array)
#5 /path/to/proje in /kunden/100170_47877/webpages/pockey/webpage/dev/vendor/phpunit/phpunit/src/TextUI/Command.php on line 98
我已经仔细检查了 class 名称、命名空间和 use
语句(这应该不是必需的,因为两个 class 都在同一个 folder/namespace ).
我是否需要以某种方式在 PHPUnit
中注册 BaseTestCase
才能成为我测试的有效超级class?
您似乎缺少测试目录的 class 路径声明。
通常,对于测试 classes 本身没有必要,因为 PhpUnit 将加载测试文件并直接读取 classes。但是在任何测试中引用的任何其他 class 都需要通过自动加载器。如果您没有声明在哪里可以找到 Test
命名空间,它会尝试在您的常规项目文件中找到它(例如在 src/
)。
为您的 composer.json
添加一个 autoload-dev
键。例如,像这样:
{
"autoload": {
"psr-4": {
"My\Project\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"My\Project\Tests\": "tests/"
}
}
}
在此之后转储自动加载器 (composer dump-autload
),然后再次尝试 运行 您的测试。
我按照 documentation 中的描述将 PHPUnit 添加到我的 Symfony 项目中。创建和 运行 第一个扩展 Symfony\Bundle\FrameworkBundle\Test\WebTestCase
的测试没问题。
现在我想创建一个自定义 WebTestCase
subclass,它为其他测试提供通用功能 classes:
// .../projectDir/tests/BaseTestCase.php
namespace My\Project\Tests;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class BaseTestCase extends WebTestCase {
protected function doSomething() {}
}
// .../projectDir/tests/SomeTest.php
namespace My\Project\Tests;
use My\Project\Tests\BaseTestCase;
class SomeTest extends BaseTestCase {
protected function testSomething() {
$this->doSomething();
...
}
}
当 运行 php bin/phpunit
我收到“Class 未找到”错误:
$ php bin/phpunit
PHP Fatal error: Uncaught Error: Class 'My\Project\Tests\BaseTestCase' not found in /path/to/projectDir/tests/SomeTest.php:6
Stack trace:
#0 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(65): include_once()
#1 /path/to/projectDir/vendor/phpunit/phpunit/src/Util/FileLoader.php(49): PHPUnit\Util\FileLoader::load('/path/to/...')
#2 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(402): PHPUnit\Util\FileLoader::checkAndLoad('/path/to/...')
#3 /path/to/projectDir/vendor/phpunit/phpunit/src/Framework/TestSuite.php(530): PHPUnit\Framework\TestSuite->addTestFile('/path/to/...')
#4 /path/to/projectDir/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php(67): PHPUnit\Framework\TestSuite->addTestFiles(Array)
#5 /path/to/proje in /kunden/100170_47877/webpages/pockey/webpage/dev/vendor/phpunit/phpunit/src/TextUI/Command.php on line 98
我已经仔细检查了 class 名称、命名空间和 use
语句(这应该不是必需的,因为两个 class 都在同一个 folder/namespace ).
我是否需要以某种方式在 PHPUnit
中注册 BaseTestCase
才能成为我测试的有效超级class?
您似乎缺少测试目录的 class 路径声明。
通常,对于测试 classes 本身没有必要,因为 PhpUnit 将加载测试文件并直接读取 classes。但是在任何测试中引用的任何其他 class 都需要通过自动加载器。如果您没有声明在哪里可以找到 Test
命名空间,它会尝试在您的常规项目文件中找到它(例如在 src/
)。
为您的 composer.json
添加一个 autoload-dev
键。例如,像这样:
{
"autoload": {
"psr-4": {
"My\Project\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"My\Project\Tests\": "tests/"
}
}
}
在此之后转储自动加载器 (composer dump-autload
),然后再次尝试 运行 您的测试。