在单元测试期间分离ZF2事件监听器

时间:2016-02-29 11:55:21

标签: php unit-testing events zend-framework2

我在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);

但这不会禁用权限系统。怎么办呢?

1 个答案:

答案 0 :(得分:0)

在此类测试用例中,您不应使用应用程序中的真实侦听器实例,但应设置 mock 。您可以在PHP单元测试教程中阅读很多关于如何使用模拟的知识。例如 here

  

它主要涉及用我们完全控制的假对象或模拟对象替换实际对象,删除外部系统的所有依赖关系或我们真正无需测试的代码

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

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