我正在使用引导程序文件运行PHPUnit,用于自动加载类(由composer生成)。
我的所有测试都很好地加载了类,但是对于我的两个测试,我创建了一个“基础”测试类,它扩展了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.php中找不到“BaseTest”类
我检查了文件名,位置,名称空间,一切似乎都是有序的。任何帮助将被欣赏到这个
的底部答案 0 :(得分:28)
我遇到了同样的问题,如果你对PHPUnit和Composer的内部工作原理不太熟悉,这确实让人感到困惑。
PHPunit不使用Composer自动加载器来查找任何测试类。它只扫描您提供的任何目录,并一次操作一个文件。
因此,它不知道任何其他类,而不是它当前正在运行的文件中的类。这就是bootstrap文件发挥作用的地方。
如果您想使用Composer Autoloader加载其他测试类,您需要告诉它在哪里可以找到这些测试类(以及可选的,在哪个命名空间中)。
有两种方法可以做到这一点:
composer.json
或autoload-dev
部分
autoload-dev
autoload-dev
部分允许您为开发目的定义自动加载规则。
直接从the manual:
报价运行测试套件所需的类不应包含在 主要自动加载规则,以避免污染生产中的自动加载器 当其他人使用你的包作为依赖。
因此,依靠单位的专用路径是个好主意 测试并在autoload-dev部分中添加它。
示例:
{ "autoload": { "psr-4": { "MyLibrary\\": "src/" } }, "autoload-dev": { "psr-4": { "MyLibrary\\Tests\\": "tests/" } } }
另一种方法是让Composer自动加载器和add
测试命名空间(如果有的话)和测试所在的目录。如何执行此操作,as described in the manual(位于“基本用法”中自动加载部分的底部)是:
$loader = require('/path/to/vendor/autoload.php'); $loader->add('Test\\', __DIR__ . '/Tests');
如果您的测试使用镜像测试目录的命名空间但仍然遇到问题,您可以尝试通过将第一个参数('Test\\'
)替换为''
来省略前缀。
如果您想进一步了解所有这些方法的工作原理,您应该查看Composer ClassLoader class,尤其是add()
和findFile()
方法。
答案 1 :(得分:2)
对我来说,解决方案要简单得多。
Test
的大写字母更改为test
,并将类名称改为 BaseSomethingtest.php
<?php
namespace Something\Tests\Sub1\Sub2;
class BaseSomethingtest
{
}
Test
,phpunit
没有将其称为 BaseSomethingTestCase.php
<?php
namespace Something\Tests\Sub1\Sub2;
class BaseSomethingTestCase
{
}
答案 2 :(得分:1)
我不确定你是否还需要解决方案,但这对我有用:
Non-testable base class extending PHPUnit_Framework_TestCase
答案 3 :(得分:0)
在PHP 7.0+中,extends PHPUnit_Framework_TestCase
已更改为extends \PHPUnit\Framework\TestCase
,请尝试此。