为什么在phpunit测试中没有加载命名空间自动加载类?

时间:2012-01-18 22:32:21

标签: namespaces phpunit php autoload

赞美phpunit,autoload和namespace之间现有的大杂烩安排是这样的:

我创建了一个运行PhpUnit测试并使用命名空间自动加载的简单测试项目。我在bootstrap文件中注册自动加载,如下所示:

set_include_path(get_include_path() . PATH_SEPARATOR . "/path/to/classes/folder");
spl_autoload_register();

在单元测试中,我加载并测试我的类,如下所示:

$obj = new \some\space\someClass(); // which is in the classes/some/space folder
$this->assertTrue($obj->foo()=='bar');

我收到错误

  

致命错误:在testSomeClass.php中找不到类'\ some \ space \ someClass'...

2 个答案:

答案 0 :(得分:7)

虽然这不是特定于phpunit的,但您需要更改:

spl_autoload_register();

spl_autoload_register('spl_autoload');

注册自动加载器的任何其他组件都会注销默认的__autoload()

  

如果您的代码具有现有的__autoload函数,则必须在__autoload堆栈上显式注册此函数。这是因为spl_autoload_register()将通过spl_autoload()或spl_autoload_call()有效地替换__autoload函数的引擎缓存。

这就是spl-autoload与使用自动加载的其他任何内容一起工作的方式。

答案 1 :(得分:4)

确保您的classes文件夹路径是相对于运行测试执行的脚本而创建的。如果脚本位于项目的子文件夹中(例如tests/),那么您的路径应为../path/to/classes/folder

这就是我tests/bootstrap.php

中的内容
set_include_path(dirname(__FILE__).'/../classes'.PATH_SEPARATOR.get_include_path());

spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload');