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

Detach ZF2 event listener during unit tests

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

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

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

It basically involves replacing the actual object with a fake, or 'mock', object that we fully control, removing all dependencies on outside systems or code that we really have no need to test

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

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