我正在使用 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/