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

发布于 2024-12-27 20:52:14 字数 536 浏览 2 评论 0原文

为了补充 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”...

To compliment an existing smorgasbord of arrangements between phpunit,autoload and namespace is this:

I have created a simple test project that runs PhpUnit tests and uses namespace autoloading. I register the autoloading in the bootstrap file like so:

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

and inside a unit test I load and test my class like so:

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

And I get an error

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断念 2025-01-03 20:52:14

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

spl_autoload_register();

注册

spl_autoload_register('spl_autoload');

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

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

这就是 spl-autoload 与其他使用自动加载。

While this is not phpunit specific you need to change:

spl_autoload_register();

to

spl_autoload_register('spl_autoload');

Any other component that registers an autoloader unregisters the default __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().

So this is how spl-autoload works together with anything else that uses autoloading.

病女 2025-01-03 20:52:14

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

这就是我的路径测试/bootstrap.php

set_include_path(dirname(__FILE__).'/../classes'.PATH_SEPARATOR.get_include_path());

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

Make sure your path to classes folder is made relative to script which is run for tests execution. If the script is in subfolder of your projects (for example tests/) then your path should be ../path/to/classes/folder

That's what I have in my tests/bootstrap.php

set_include_path(dirname(__FILE__).'/../classes'.PATH_SEPARATOR.get_include_path());

spl_autoload_extensions('.php');
spl_autoload_register('spl_autoload');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文