【问题标题】:Detach ZF2 event listener during unit tests在单元测试期间分离 ZF2 事件监听器
【发布时间】:2016-06-12 10:53:08
【问题描述】:

我在 onBootstrap 方法的模块中设置了一个事件监听器(它检查用户权限):

// attach permission listener to route event
$eventManager = $e->getApplication()->getEventManager();
$sm = $e->getApplication()->getServiceManager();
$permissionsListener = $sm->get('MyModule\Listener\Permissions');
$permissionsListener->attach($eventManager);

在普通应用中可以正常工作。

对于单元测试,如果我可以禁用此权限系统以轻松检查所有页面是否正常工作,而不必担心设置假管理员用户,那就太好了。

但我不知道该怎么做。

在扩展 AbstractHttpControllerTestCase 的测试中,我做了这样的事情:

// detach permission listener to route event
$sm = Bootstrap::getServiceManager();
$eventManager = $this->getApplication()->getEventManager();
$permissionsListener = $sm->get('MyModule\Listener\Permissions');
$permissionsListener->detach($eventManager);

但这不会禁用权限系统。如何做到这一点?

【问题讨论】:

  • 你试过模拟权限监听器吗?我们的项目中有类似的设置。我们在单元测试中所做的也是模拟监听器

标签: php unit-testing events zend-framework2


【解决方案1】:

在这样的测试用例中,您不应使用应用程序中的 real 侦听器实例,而应设置 mock。您可以在 PHP 单元测试教程中阅读很多关于如何使用模拟的内容。例如 here

它基本上涉及用我们完全控制的假或“模拟”对象替换实际对象,消除对外部系统或我们确实不需要测试的代码的所有依赖

$className = 'MyModule\Listener\Permissions';
$mock = $this->getMockBuilder($className)->getMock();

现在您还可以使用$mock 来设置您想在测试期间使用的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-05-27
    • 2014-09-30
    • 2018-03-17
    • 2019-12-31
    • 2014-11-16
    相关资源
    最近更新 更多