36

我正在使用引导文件运行 PHPUnit 以自动加载类(由 composer 生成)。

我所有的测试都加载了类,但是对于我的两个测试,我做了一个扩展的“基础”测试类\PHPUnit\Framework\TestCase(类似于PHPUnit_Framework_TestCasePHPUnit7 之前),然后是两个扩展基类的测试类,结构类似于下面的例子代码:

    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”

我检查了文件名、位置、命名空间,一切似乎都井井有条。任何帮助将不胜感激

4

4 回答 4

40

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

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

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

如果您想使用 Composer Autoloader 加载其他测试类,您需要告诉它在哪里可以找到这些测试类(以及,可选地,在哪个命名空间中)。

有两种方法可以做到这一点:

  1. autoload-dev部分添加到您的composer.json
  2. 将测试目录添加到 Composer Autoloader

利用autoload-dev

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

直接从手册中引用:

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

因此,依赖于单元测试的专用路径并将其添加到 autoload-dev 部分是一个好主意。

例子:

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

添加到 Composer 自动加载器

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

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

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


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

于 2013-11-19T14:47:09.267 回答
3

对我来说,解决方案要简单得多。

  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
{
}
于 2017-07-28T09:30:01.117 回答
2

我不确定您是否仍然需要解决方案,但这对我有用:
Non-testable base class extended PHPUnit_Framework_TestCase

于 2014-12-04T09:15:26.730 回答
-1

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

于 2018-07-22T15:41:26.107 回答