如果在 Bootstrap 中自动/手动加载测试类,PHPUnit无法找到测试类

1zmg4dgp  于 2023-03-28  发布在  PHP
关注(0)|答案(2)|浏览(137)

我在PHPUnit中遇到了一个不寻常的类加载问题,最初是在4.3.5中遇到的,现在是最新的4.4.2(最新的稳定版)。
我有一个bootstrap文件,它是通过phpunit.xml自动加载的,其中包括Composer的默认自动加载器和我自己的自动加载器。这工作得很好。但是,我发现如果我在bootstrap中加载一个测试类,那么PHPUnit就不能正确解析类名,因此它不能加载。
我得到这个错误:
无法在“/full/project/path/webapp/test/unit/tests/UpdateAllTest.php”中找到类“test/unit/tests/UpdateAllTest.php”。
(My在 Bootstrap 中引用测试类的目的是在每个测试类中添加一个数据库构建方法,将其与其所属的测试文件保持在一起。我计划在 Bootstrap 中执行此操作,而不是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,这通常是由我的自动加载器中的自定义Map处理的。
我不认为我在PHPUnit上做了什么特别不寻常的事情,所以我觉得这不太可能是一个迄今为止没有人经历过的bug。在这种情况下,我是否需要在phpunit.xml中声明类名称空间或类似的不寻常的东西?抓住救命稻草吧!
这个看起来微不足道的问题可能是什么原因造成的呢?同时,我将把这些设置方法移到一个不同的文件/类中--虽然不理想,但也不是世界末日。我使用的是PHP 5.5.x和Ubuntu 12.04。

e0uiprwp

e0uiprwp1#

我还没有解决这个问题,但是我的构建方法现在太长了,无论如何,它们出现在不同的类中是有意义的。我有一个命名约定,这样*Test.php的测试就有一个对应的构建类*Build.php
我使用PHPUnit的引导系统来扫描构建类并自动调用内部的静态build()

wn9m85ua

wn9m85ua2#

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

相关问题