如果 PHPUnit 在引导程序中自动/手动加载,则找不到测试类


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

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

我有一个引导程序文件,它通过phpunit.xml自动加载,其中包括 Composer 的默认自动加载器和我自己的自动加载器。这工作正常。但是,我发现如果我引导程序中加载测试类,则 PHPUnit 无法正确解析类名,因此无法加载。

我收到此错误:

类"test/unit/tests/UpdateAllTest"在"/full/project/path/webapp/test/unit/tests/UpdateAllTest.php"中找不到。

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

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

    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中声明类命名空间或类似异常的东西?在这里抓住稻草!

这个看似微不足道的问题的原因可能是什么?同时,我将把这些设置方法移动到不同的文件/类 - 不理想,但也不是世界末日。我使用的是 PHP 5.5.x 和 Ubuntu 12.04。

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

我使用 PHPUnit 的引导系统来扫描构建类并自动调用静态build()

也许您也遇到了这个问题。

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