如果 PHPUnit 在 bootstrap 中加载了 auto/manually,则找不到测试 class

PHPUnit can't find test class if it is auto/manually loaded in bootstrap

我在 PHPUnit 中遇到了一个不寻常的 class 加载问题,最初是 4.3.5,现在是最新的 4.4.2(最新稳定版)。

我有一个 bootstrap 文件,它通过 phpunit.xml 自动加载,其中包括 Composer 的默认自动加载器和我自己的自动加载器。这很好用。但是,我发现如果我在 bootstrap 中加载测试 class ,那么 PHPUnit 无法解析 class 命名正确,因此不会加载。

我收到这个错误:

Class 'test/unit/tests/UpdateAllTest' could not be found in '/full/project/path/webapp/test/unit/tests/UpdateAllTest.php'.

(我想在 bootstrap 中引用测试 class 的目的是在每个测试中添加一个数据库构建方法,将其与它所属的测试文件保持在一起。我计划在 bootstrap 而不是 setUp() 方法中执行此操作,因为我希望它在所有测试中 运行 一次,而不是每个测试方法一次)。

我在 PHPUnit 本身(特别是 PHPUnit_Runner_StandardTestSuiteLoader::load)内部做了一些简单的调试,发现 class 名称被错误地提供为路径而不是命名空间 class 名称。这是相关条款:

    if (class_exists($suiteClassName, false)) {
        $class = new ReflectionClass($suiteClassName);

        if ($class->getFileName() == realpath($suiteClassFile)) {
            return $class;
        }
    }

$suiteClassName 的值是 test/unit/tests/UpdateAllTest,这显然不是命名空间的任何东西 - 它应该是 Awooga\Testing\Unit\UpdateAllTest,通常由我的自动加载器中的自定义映射处理的东西。

我不认为我正在做任何特别是与PHPUnit不寻常的事情,所以我认为这不太可能是其他人没有的错误到目前为止经历过。在这些情况下,我是否需要在 phpunit.xml 中声明 class 命名空间或类似的不寻常的东西?抓住救命稻草!

任何关于这个看似微不足道的问题的原因的想法都将不胜感激。与此同时,我将把这些设置方法移动到不同的 file/class - 不理想但也不是世界末日。我在 PHP 5.5.x 和 Ubuntu 12.04.

我还没有解决这个问题,但我的构建方法现在太长了,无论如何它们出现在不同的 classes 中是有意义的。我有一个命名约定,因此 *Test.php 的测试具有 *Build.php 的相应构建 class。

我使用 PHPUnit 的 bootstrap 系统扫描构建 classes 并在其中自动调用静态 build()

也许你也在经历this problem

此时将路径作为参数是正常行为,请在 PHPUnit_Runner_StandardTestSuiteLoader::load 中进一步检查导致此令人困惑的错误消息。