2017-03-01 32 views
1

我從我的控制器發射一個事件,我想斷言它在IntegrationTestCase中被解僱。我嘗試使用assertEventFired()方法,但我得到一個錯誤:是否可以使用IntegrationTestCase來assertEventFired?

The event manager you are asserting against is not configured to track events.

我不知道怎樣才能得到控制的一個實例做$controller->eventManager()->setEventList(new EventList());啓用事件跟蹤。

是否可以使用IntegrationTestCase做到這一點,還是我需要手動構建控制器,因爲它在Cake\Controller\Controller的核心測試套件中完成?

CakePHP的3.3.15

回答

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

又見