我在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。
2条答案
按热度按时间e0uiprwp1#
我还没有解决这个问题,但是我的构建方法现在太长了,无论如何,它们出现在不同的类中是有意义的。我有一个命名约定,这样
*Test.php
的测试就有一个对应的构建类*Build.php
。我使用PHPUnit的引导系统来扫描构建类并自动调用内部的静态
build()
。wn9m85ua2#
也许您也正在体验this problem。
此时,将路径作为参数是正常行为,在
PHPUnit_Runner_StandardTestSuiteLoader::load
中进一步检查会导致此令人困惑的错误消息。