为PHPUnit创建基本测试类并将其扩展为常见功能会导致找不到类错误

时间:2013-09-18 18:51:58

标签: php unit-testing phpunit

我正在使用引导程序文件运行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”类

我检查了文件名,位置,名称空间,一切似乎都是有序的。任何帮助将被欣赏到这个

的底部

4 个答案:

答案 0 :(得分:28)

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

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

因此,它不知道任何其他类,而不是它当前正在运行的文件中的类。这就是bootstrap文件发挥作用的地方。

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

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

  1. composer.json
  2. 中添加autoload-dev部分
  3. 将测试目录添加到Composer Autoloader
  4. 使用autoload-dev

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

    直接从the manual

    报价
      

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

         

    因此,依靠单位的专用路径是个好主意   测试并在autoload-dev部分中添加它。

         

    示例:

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

    添加到Composer Autoloader

    另一种方法是让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)

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

  1. 我在文件末尾将Test的大写字母更改为test,并将类名称改为
  2. BaseSomethingtest.php

    <?php
    
    namespace Something\Tests\Sub1\Sub2;
    
    class BaseSomethingtest
    {
    }
    
    1. 我只是在我的基类结束时说了一句话。就此而言 未完成Testphpunit没有将其称为
    2. 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,请尝试此。