我在PHPUnit中遇到了一个不寻常的类加载问题,最初使用的是4.3.5,现在最新的4.4.2(最新的稳定版)。
我有一个自动加载phpunit.xml
的引导文件,其中包括Composer的默认自动加载器以及我自己的自动加载器。这样可以正常工作。但是,我发现如果在引导程序中加载测试类,则PHPUnit无法正确解析类名,因此无法加载。
我收到此错误:
在'/full/project/path/webapp/test/unit/tests/UpdateAllTest.php'中找不到类'test / unit / tests / UpdateAllTest'。
(我想在引导程序中引用测试类的目的是在每个引脚中添加一个数据库构建方法,并将其与所属的测试文件保持一致。我计划在引导程序中执行此操作,而不是{ {1}}方法,因为我希望它在所有测试中运行一次,而不是每个测试方法运行一次。)
我在PHPUnit本身(特别是setUp()
)中做了一些轻量级的调试,发现类名错误地作为路径提供,而不是作为命名空间的类名提供。以下是相关条款:
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
,这通常由我的自动加载器中的自定义映射处理。
我不认为我在使用PHPUnit做任何事情特别,因此发现这不是其他人迄今为止所遇到的错误。在这种情况下,我是否需要声明Awooga\Testing\Unit\UpdateAllTest
中的类名称空间或类似的异常?在这里抓住稻草!
任何关于这个看似微不足道的问题的原因的想法都会受到赞赏。与此同时,我将把这些设置方法移到另一个文件/类 - 不理想但不是世界末日。我使用的是PHP 5.5.x和Ubuntu 12.04。
答案 0 :(得分:1)
我还没有解决这个问题,但我的构建方法现在已经很长了,无论如何它们都出现在不同的类中是有意义的。我有一个命名约定,以便*Test.php
的测试具有相应的构建类*Build.php
。
我使用PHPUnit的引导系统来扫描构建类并自动调用静态build()
。
答案 1 :(得分:1)
也许您还遇到了this problem。
此时将路径作为参数是正常行为,请在PHPUnit_Runner_StandardTestSuiteLoader::load
中进一步检查导致此混淆错误消息。