php - 如何使用 PHPUnit 测试 Zend Framework 2 中的 EventListener

标签 php events zend-framework2 phpunit event-listener

我正在使用 Zend Framework 2 开发一个应用程序。某些应用程序服务会通知感兴趣的监听器,这些监听器会触发其他服务中的某些方法,例如:

用户服务

<?php

class UserService implements EventManagerAwareInterface 
{
     public function create($data = array()) 
     {
         // user is already created here
         $params = array("user" => $user);
         $this->getEventManager()->trigger(__FUNCTION__ . '.post', $this, $params);
     }
}

用户监听器

<?php

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class UserListener implements ListenerAggregateInterface
{
    protected $serviceManager;

    protected $listeners = array();

    public function __construct(ServiceLocatorInterface $serviceManager) 
    {
        $this->serviceManager = $serviceManager;
    }    

    public function attach(EventManagerInterface $events) 
    {
        $evm = $events->getSharedManager();

        $this->listeners[] = $evm->attach('Application\Service\UserService', 'create.post', array($this, 'notify'));
    }

    public function detach(EventManagerInterface $events) 
    {
        foreach ($this->listeners as $index => $listener) {
            if ($events->detach($listener)) {
                unset($this->listeners[$index]);
            }
        }
    }

    public function notify(EventInterface $events) 
    {
        $user = $events->getParam('user');
        $mailService = $this->serviceManager->get('MailService');
        $mailService->sendWelcomeMessage($user);
    } 
}

所以,我的问题是使用 PHPUnit 测试 Zend Framework 事件监听器的最佳实践是什么,所有监听器方法如何 attach()detach()notify() 等应该正确测试吗?

任何帮助将不胜感激!提前致谢!

最佳答案

如果您查看 apigility zf-mvc-auth 源代码,您会看到很多监听器测试的示例。

https://github.com/zfcampus/zf-mvc-auth/tree/master/test/Authorization

虽然有些人可能会声称这些不是完全正确的单元测试,并且它们在单元测试和功能测试之间模糊了界限,但我发现以这种方式测试监听器是最简单、最有效的方法做到这一点,而不会陷入过度模拟的测试困惑中。它们干净、易于编写且易于理解。

关于php - 如何使用 PHPUnit 测试 Zend Framework 2 中的 EventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852064/

相关文章:

php - Zend Framework 2 定时任务

javascript - 如何找出触发了哪些 JavaScript 事件?

python - 如何在Python中通过中断创建事件系统

php - 限制大型数据库的分页数

php - 如何在 PHP 中改进以下代码

c# - .net 中等效的 Treeview.OnChange 事件是什么?

php - 在 zend-developer-toolbar ZF2 中激活 BjyAuthorize 的问题

zend-framework2 - Controller 不会在初始化器闭包中被调用

php - Neo4j PHP Graphaware '400 Bad Content-Type header' 错误

php -/tmp 目录未在实时服务器上清理