是否可以使用IntegrationTestCase来assertEventFired?

时间:2017-03-01 21:25:31

标签: unit-testing cakephp cakephp-3.3

我正在从我的控制器中触发一个事件,我想断言它是在IntegrationTestCase中触发的。我尝试使用assertEventFired()方法,但收到错误:

  

您声明的事件管理器未配置为跟踪   事件

我看不出如何让控制器的实例执行$controller->eventManager()->setEventList(new EventList());以启用事件跟踪。

是否可以使用IntegrationTestCase执行此操作,还是需要像Cake\Controller\Controller的核心测试套件中那样手动构建控制器?

cakephp 3.3.15

1 个答案:

答案 0 :(得分:1)

您可以使用覆盖IntegrationTestCase::controllerSpy()方法访问控制器,并且在分派请求后,控制器也可以通过您的测试方法中的$this->_controller获得。

public function controllerSpy($event, $controller = null)
{
    parent::controllerSpy($event, $controller);

    if (isset($this->_controller)) {
        $eventList = new \Cake\Event\EventList();
        $this->_controller->eventManager()->setEventList($eventList);
    }
}

public function someTest()
{
    // ...

    $this->assertEventFired('someEvent', $this->_controller->eventManager());
}

您可能还可以依赖全局事件管理器,因为每个请求应该只有一个控制器。

然而,这也要求事件名称是唯一的,因为不可能使用assertEventFired()进一步限制事件的起源,因此这不是一个过于好的解决方案。但是,为了完成,这里也是一个例子。

public function someTest()
{
    $eventList = new \Cake\Event\EventList();
    \Cake\Event\EventManager::instance()->setEventList($eventList);

    // ...

    $this->assertEventFired('someEvent');
}

另见