【问题标题】:ServiceManager can't find classes by full namespace when testing with phpunit使用 phpunit 进行测试时,ServiceManager 无法按完整命名空间查找类
【发布时间】:2013-01-03 09:10:48
【问题描述】:

在某些情况下,我会通过它们的完整类名从 ServiceManager 中检索实例,例如:

$someThing = $serviceManager->get('MyModule\Some\Nice\Lib\SomeThing');

这对于 HTTP MVC 请求非常有效,但是,当使用 phpunit 时,ServiceManager 找不到它。 (它会引发 Zend\ServiceManager\Exception\ServiceNotFoundException 异常,并显示消息“Zend\ServiceManager\ServiceManager::get 无法获取或创建实例...”)

我正在使用来自the docs 的默认测试引导示例,我在不同机器上的两个不同项目中遇到了这个问题,所以我想这是一个普遍的问题。

我的第一个猜测是它与 MVC 或应用程序有关,因为这很可能是测试和 http 之间唯一真正的区别。我什至在两种模式下都转储了 SM 实例并将它们相互比较,查看源代码并搜索网络。

很遗憾,由于我的劳动合同,我无法粘贴任何代码。但是,正如我所说,我认为这是一个普遍问题,因此您应该能够轻松地重现它。

有谁知道是什么导致了这个问题以及如何解决它?

【问题讨论】:

    标签: php unit-testing zend-framework2 servicemanager


    【解决方案1】:

    确保您已将模块添加到测试配置中:

    return array(
        'modules' => array(
            'MyModule',
            //...
        ),
        //...
    );
    

    否则 ModuleManager 将不会尝试加载它,因此模块自动加载器将不会被注册

    【讨论】:

    • 模块加载完毕,我也可以直接用new关键字实例化。
    • 那么您的服务的配置可能在应用程序级别配置中并且在测试期间未加载?
    【解决方案2】:

    我设法找到了问题。

    当您使用ServiceManager 创建具有完整类名的实例时,实际上默认情况下无法创建它。但是,如果可能,它会将任务委托给附加到它的抽象工厂。

    现在,当您使用 DiFactory 创建 Di 实例时,工厂会将 DiAbstractServiceFactory 注册到 SM。而且,你猜对了,这个抽象工厂能够通过类的全名来实例化类。

    我在这个项目中很少使用Di(因为我并没有真正适应它并且一开始就用错了;我现在知道得更好了),这就是为什么我实例化@987654325的唯一点@ 在模块的 onBootstrap() 方法内。这在 MVC 上下文中很好,但是,因为 onBootstrap() 是一个 HTTP MVC 事件处理程序,它不会在我的测试应用程序中被调用。因此,任何时候都不会实例化Di,因此ServiceManager 没有附加DiAbstractServiceFactory,因此它不能委托get() 调用,因此它无法通过它们的完整实例化类类名。

    就这么简单! :-)

    显而易见的解决方案:在测试应用程序中创建一个Di 实例。

    【讨论】:

    • 您忘记提及问题中最重要的部分:您使用了 Zend\Di 而 SM 只是一个代理。 :P
    • 能否分享示例代码。我也有同样的问题,无法克服。
    • 没有太多示例代码可以分享。只需在某处调用$serviceManager->get('Di');
    • 我已经根据zf2.readthedocs.org/en/latest/user-guide/unit-testing.html 编写了代码,所以在此您能告诉我们必须在哪里进行所有更改,以便我们能够克服这个问题吗?
    • 我也是。只要把它放在它总是被执行的地方(例如在 Bootstrap.php 中)。
    猜你喜欢
    • 2015-11-13
    • 2018-07-29
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2013-03-21
    • 2017-11-27
    • 2021-07-12
    相关资源
    最近更新 更多