为啥通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类?

Posted

技术标签:

【中文标题】为啥通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类?【英文标题】:Why is my custom TestCase class not being found when running tests through PhpUnit?为什么通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类? 【发布时间】:2021-10-25 12:23:49 【问题描述】:

我将 phpUnit 添加到我的 Symfony 项目中,如 documentation 中所述。创建和运行扩展 Symfony\Bundle\FrameworkBundle\Test\WebTestCase 的第一个测试没有问题。

现在我想创建一个自定义的WebTestCase 子类,它为其他测试类提供通用功能:

// .../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 时,我收到“找不到类”错误:

$ 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

我已经仔细检查了类名、命名空间和use 语句(这不是必需的,因为两个类都在同一个文件夹/命名空间中)。

我是否需要在PHPUnit 中注册BaseTestCase 才能成为我测试的有效超类?

【问题讨论】:

【参考方案1】:

您似乎缺少测试目录的类路径声明。

一般来说,对于测试类本身是没有必要的,因为 PhpUnit 会加载测试文件并直接读取类。但是任何测试中引用的任何其他类都需要通过自动加载器。如果您没有声明在哪里可以找到 Test 命名空间,它会尝试使用您的常规项目文件(例如在 src/ 中)找到它。

autoload-dev 密钥添加到您的composer.json。例如,像这样:


"autoload": 
    "psr-4": 
      "My\\Project\\": "src/"
    
  ,
  "autoload-dev": 
    "psr-4": 
      "My\\Project\\Tests\\": "tests/"
    
  

在此之后转储自动加载程序 (composer dump-autload),然后再次尝试运行测试。

【讨论】:

以上是关于为啥通过 PhpUnit 运行测试时找不到我的自定义 TestCase 类?的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit:使用@runTestsInSeparateProcesses 时找不到嘲弄

测试新模型时找不到 Eloquent 类

为啥当我运行我的 phpunit 测试时,我得到一个空响应,但 Postman 中的相同路由/用户的行为符合预期?

为啥我的项目在手机中将其作为渐进式 Web 应用程序下载时找不到一些图像?

运行“排毒测试”时找不到模块@jest/reporters

为啥我的代码在渲染时找不到类?