我正在使用引导程序文件运行PHPUnit,用于自动加载类(由作曲家生成)。
我所有的测试都可以很好地加载类,但是对于我的两个测试,我创建了一个扩展PHPUnitFrameworkTestCase
的"基本"测试类(类似于PHPUnit7之前的PHPUnit_Framework_TestCase
),然后是两个扩展基类的测试类,类似于以下示例代码的结构:
abstract class BaseTest extends PHPUnitFrameworkTestCase
{
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 自动加载器加载其他测试类,则需要告诉它在哪里可以找到这些测试类(以及可选的命名空间)。
有两种方法可以执行此操作:
- 将
autoload-dev
部分添加到composer.json
或 - 将测试目录添加到编辑器自动加载器
使用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()
方法。
,解决方案要简单得多。
- 我将文件末尾的大写字母
Test
更改为test
和类名
BaseSomethingtest.php
<?php
namespace SomethingTestsSub1Sub2;
class BaseSomethingtest
{
}
- 我只是在我的基础课的末尾放了一个词。就它而言没有说完
Test
,phpunit
没有叫
BaseSomethingTestCase.php
<?php
namespace SomethingTestsSub1Sub2;
class BaseSomethingTestCase
{
}
我不确定您是否还需要解决方案,但这对我有用:
不可测试的基类扩展PHPUnit_Framework_TestCase
在 PHP 7.0+ 中extends PHPUnit_Framework_TestCase
更改为 extends PHPUnitFrameworkTestCase
,试试这个。