赞美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'...
答案 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');