2012-01-18 53 views
3

恭维的PHPUnit的,自动加载和命名空间之间的安排现有的自助餐是这样的:为什么不在phpunit测试中加载名称空间自动载入类?

我创建了一个运行PHPUnit测试,并使用自动加载命名空间的一个简单的测试项目。我注册的引导文件中自动加载像这样:

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'); 

我得到一个错误

Fatal error: Class '\some\space\someClass' not found in testSomeClass.php...

+0

而'someClass'是在'classes/some/space/someClass.php'中定义的,大小写匹配* * – 2012-01-18 22:49:21

+0

是的,我实际上大部分都使用我的ide的(phpstorm)自动完成功能。 – 2012-01-18 22:51:17

回答

7

虽然这不是PHPUnit的特定需要改变:

spl_autoload_register(); 

spl_autoload_register('spl_autoload'); 

任何其他注册自动装载机的组件都会取消注册默认的__autoload()

If your code has an existing __autoload function then this function must be explicitly registered on the __autoload stack. This is because spl_autoload_register() will effectively replace the engine cache for the __autoload function by either spl_autoload() or spl_autoload_call().

因此,这是怎么spl-autoload与其他任何使用自动加载一起工作。

+0

虽然你的答案确实解决了这个问题,但我并不十分清楚为什么会这样,考虑到它在第一次通话时效果很好(没有'spl_autoload'字符串作为参数),它唯一停止的地方是当我在phpunit中使用它时。谢谢 – 2012-01-19 00:16:48

+6

根据['spl_autoload_register()'](http://us3.php.net/manual/en/function.spl-autoload-register.php)的文档“,如果没有提供参数,那么默认实现''spl_autoload()'将被注册。“没有参数应该相当于传递''spl_autoload'',上面的改变应该没有效果!真棒。:) – 2012-01-19 02:07:32

4

确保您的类文件夹路径与运行测试执行的脚本相关。如果脚本是在你的项目的子文件夹(例如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'); 
+0

对,我试过使用绝对路径,结果相同 – 2012-01-18 22:41:37

+0

我试过各种相对路径的组合,仍然没有运气 – 2012-01-18 22:54:56

+0

当你正常运行应用程序时,你的自动加载工作是否正常? – Mchl 2012-01-18 22:57:23