1

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

您断言的事件管理器未配置为跟踪事件。

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

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

蛋糕PHP 3.3.15

4

1 回答 1

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');
}

也可以看看

于 2017-03-01T22:24:45.593 回答