【问题标题】:PhpStorm with PHPUnit 8.4 gives exception Uncaught PHPUnit\Runner\Exception class ... could not be found带有 PHPUnit 8.4 的 PhpStorm 给出异常 Uncaught PHPUnit\Runner\Exception class ... 找不到
【发布时间】:2023-03-27 01:07:01
【问题描述】:

我尝试使用 PHPUnit v8。但是我没有成功使用 PhpStorm。当我在 PhpStorm 中运行简单测试(类方法)时,我收到以下消息:

PHP Fatal error:  Uncaught PHPUnit\Runner\Exception: Class 'Mrself\\TreeType\\Tests\\Functional\\BuildingTest' could not be found in '/vagrant/symfony-tree-type/tests/Functional/BuildingTest.php'. in /vagrant/symfony-tree-type/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php:65

是的,我有那个课程,是的,我已经正确配置了 psr:

"autoload": {
        "psr-4": {
            "Mrself\\TreeType\\": "./src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Mrself\\TreeType\\Tests\\": "./tests/"
        }
    }

我已正确设置一切的证据是,当我运行 vendor/bin/phpunit 时,它给了我正确的结果。

当我在 PhpStorm 中运行方法时,我收到了以下调用:

/usr/bin/php /vagrant/symfony-tree-type/vendor/phpunit/phpunit/phpunit --configuration /vagrant/symfony-tree-type/phpunit.xml --filter "/(::testFormCanBeBuild)( .*)?$/" Mrself\\TreeType\\Tests\\Functional\\BuildingTest /vagrant/symfony-tree-type/tests/Functional/BuildingTest.php --teamcity

但是,如果我在类命名空间前面加上 \\,一切都会正常工作。我不知道发生了什么。 PHPUnit 版本 7 也可以。

【问题讨论】:

  • 我也看到了这个问题。无法运行单个类或单个方法,但测试整个目录仍在运行
  • 我几个星期都遇到同样的问题。将 PHPUnit 降级到 8.3 时,它又可以正常工作了。在此报告:youtrack.jetbrains.com/issue/WI-49333

标签: phpunit phpstorm


【解决方案1】:

同样的事情发生在我身上。突然之间,我开始收到以下错误:

PHP Fatal error:  Uncaught PHPUnit\Runner\Exception: Class 'Tests\\Feature\\ExampleTest' could not be found 

在我阅读了@frank-vue 的评论后,我注意到了同样的事情,他做到了:如果我对整个文件夹运行测试,它会正常运行,但如果我对特定的类/方法运行测试,我会收到该错误。

我尝试了早期版本的 PHPStorm,降级 PHP 插件等...但没有任何效果。

就我而言,当我检查堆栈跟踪时,如下所示:

#0 /var/www/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(145): PHPUnit\Runner\StandardTestSuiteLoader->load('Tests\\\\Unit\\\\Ex...', '/var/www/tests/...')
#1 /var/www/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(105): PHPUnit\Runner\BaseTestRunner->loadSuiteClass('Tests\\\\Unit\\\\Ex...', '/var/www/tests/...')
#2 /var/www/vendor/phpunit/phpunit/src/TextUI/Command.php(177): PHPUnit\Runner\BaseTestRunner->getTest('Tests\\\\Unit\\\\Ex...', '/var/www/tests/...', Array)
#3 /var/www/vendor/phpunit/phpunit/src/TextUI/Command.php(159): PHPUnit\TextUI\Command->run(Array, true)
#4 /var/www/vendor/phpunit/phpunit/phpunit(61): PHPUnit\TextUI\Command::main()
#5 {main}
  thrown in /var/www/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php on line 69

注意Tests\\\\Unit\\\\Ex... 而不是Tests\\Unit\\Ex...

所以最后我打破了规则,我修改了供应商文件,应该不惜一切代价避免,但作为一个临时解决方案,它解决了我的问题。

所以我在第 98 行(PHPUnit 版本 8.4.1)的 vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php 添加了 1 行,它替换了不必要的 '\'s。

if (empty($suiteClassFile) && \is_dir($suiteClassName) && !\is_file($suiteClassName . '.php')) {
    /** @var string[] $files */
    $files = (new FileIteratorFacade)->getFilesAsArray(
        $suiteClassName,
        $suffixes
    );

    $suite = new TestSuite($suiteClassName);
    $suite->addTestFiles($files);

    return $suite;
}
$suiteClassName = str_replace('\\\\', '\\', $suiteClassName); // THIS IS THE LINE I ADDED
try {
    $testClass = $this->loadSuiteClass(
        $suiteClassName,
        $suiteClassFile
    );
} catch (Exception $e) {
    $this->runFailed($e->getMessage());
    return null;
}

【讨论】:

  • 是的,它似乎解决了这个问题。认为你应该做一个 PR 来解决这个问题
  • 我几个星期都遇到同样的问题。将 PHPUnit 降级到 8.3 时,它又可以正常工作了。在此报告:youtrack.jetbrains.com/issue/WI-49333
猜你喜欢
  • 2016-10-14
  • 2013-01-12
  • 2013-11-30
  • 1970-01-01
  • 2013-07-18
  • 2018-11-21
  • 2017-08-14
  • 2015-10-11
  • 2013-08-21
相关资源
最近更新 更多