为 PHPUnit 创建基本测试类并针对常见功能对其进行扩展会导致“找不到类”错误


Creating a base test-class for PHPUnit and extending it for common functionality results in class not found error

我正在使用引导程序文件运行PHPUnit,用于自动加载类(由作曲家生成)。

所有的测试都可以很好地加载类,但是对于我的两个测试,我创建了一个扩展'PHPUnit'Framework'TestCase的"基本"测试类(类似于PHPUnit7之前的PHPUnit_Framework_TestCase),然后是两个扩展基类的测试类,类似于以下示例代码的结构:

    abstract class BaseTest extends 'PHPUnit'Framework'TestCase
    {
        abstract function setUp();
        protected function getCommonTestVariables()
        {
            // ...
        }
        protected function runCommonTests()
        {
            // ...
        }
    }
    class BlahBlahTest extends BaseTest
    {
        public function setUp()
        {
             $variables=$this->getCommonTestVariables();
             //etc...
        }
        public function testThings()
        {
            $this->runCommonTests();
        }
    }

每当我运行这个时,PHPUnit都会给出一个错误:

致命错误:在第 13 行的 BlahBlahTest 中找不到类"BaseTest".php

我已经检查了文件名,位置,命名空间,一切似乎都井井有条。任何帮助将不胜感激,以深入了解这一点

我遇到了同样的问题,如果你不太熟悉 PHPUnit 和 Composer 的内部工作原理,这确实看起来很令人困惑。

PHPunit 不使用 Composer 自动加载器来查找任何测试类。它只是扫描您提供给它的任何目录,并一次对一个文件进行操作。

因此,除了当前正在操作的文件中的类之外,它不知道任何其他类。这就是引导程序文件发挥作用的地方。

如果要使用 Composer 自动加载器加载其他测试类,则需要告诉它在哪里可以找到这些测试类(以及可选的命名空间)。

有两种方法可以执行此操作:

  1. autoload-dev部分添加到composer.json
  2. 将测试目录添加到编辑器自动加载器

使用autoload-dev

autoload-dev部分允许您定义用于开发目的的自动加载规则。

直接引用手册:

运行测试套件所需的类不应包含在 主要自动加载规则,以避免在生产中污染自动加载器 以及当其他人将您的包用作依赖项时。

因此,最好为您的设备依靠专用路径 测试并将其添加到自动加载开发部分中。

例:

{
    "autoload": {
        "psr-4": { "MyLibrary''": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary''Tests''": "tests/" }
    }
}

添加到编辑器自动加载器

另一种方法是获取 Composer 自动加载器并add您的测试命名空间(如果有)和测试所在的目录。如何做到这一点,如手册中所述(在"基本用法"中自动加载部分的底部)是:

$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test''', __DIR__ . '/Tests');

如果您的测试使用镜像测试目录的命名空间,并且您仍然遇到问题,则可以尝试通过将第一个参数 ( 'Test''' ) 替换为 '' 来省略前缀。


如果你想进一步了解所有这些是如何工作的,你应该看看 Composer ClassLoader 类,尤其是 add()findFile() 方法。

对我来说

,解决方案要简单得多。

  1. 我将文件末尾的大写字母Test更改为test和类名

BaseSomethingtest.php

<?php
namespace Something'Tests'Sub1'Sub2;
class BaseSomethingtest
{
}
  1. 我只是在我的基础课的末尾放了一个词。就它而言没有说完Testphpunit没有叫

BaseSomethingTestCase.php

<?php
namespace Something'Tests'Sub1'Sub2;
class BaseSomethingTestCase
{
}

我不确定您是否还需要解决方案,但这对我有用:
不可测试的基类扩展PHPUnit_Framework_TestCase

在 PHP 7.0+ 中extends PHPUnit_Framework_TestCase更改为 extends 'PHPUnit'Framework'TestCase ,试试这个。