【问题标题】:Why aren't namespace autoload classes loading in phpunit tests?为什么不在 phpunit 测试中加载命名空间自动加载类?
【发布时间】:2012-02-13 16:00:34
【问题描述】:

为了补充 phpunit、autoload 和命名空间之间现有的大杂烩安排:

我创建了一个简单的测试项目,它运行 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');

我得到一个错误

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

【问题讨论】:

  • someClass 是在classes/some/space/someClass.php 中定义的,大小写匹配准确吗?
  • 是的,我实际上大部分时间都使用了我的 ide (phpstorm) 自动完成功能。

标签: namespaces phpunit php autoload


【解决方案1】:

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

spl_autoload_register();

spl_autoload_register('spl_autoload');

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

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

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

【讨论】:

  • 虽然你的回答确实解决了问题,但我不太清楚为什么会这样,考虑到它在第一次调用时工作正常(没有 'spl_autoload' 字符串作为参数),并且唯一停止的地方是当我在 phpunit 中使用它时。谢谢
  • 根据spl_autoload_register() 的文档,“如果没有提供参数,则将注册spl_autoload() 的默认实现。”没有参数应该相当于传递'spl_autoload',上面的更改应该没有效果!惊人的。 :)
【解决方案2】:

确保您的类文件夹路径是相对于为测试执行而运行的脚本创建的。如果脚本在您的项目的子文件夹中(例如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');

【讨论】:

  • 对,我试过用绝对路径,结果一样
  • 我也尝试过各种相对路径的组合,仍然没有成功
  • 正常运行应用程序时自动加载是否有效?
  • Mchl,你有没有让 phpunit 使用这种类自动加载?我问是因为对此的肯定意味着这是我机器上的配置错误,而不是 phpunit 或其他的怪癖。
  • 多么奇怪 - 我已将 spl_autoload_register() 更改为 spl_autoload_register('spl_autoload') 现在它正在工作
猜你喜欢
  • 2014-10-02
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2021-06-29
  • 2011-11-19
  • 2013-11-25
相关资源
最近更新 更多