2017-03-01 8 views
1

컨트롤러에서 이벤트를 실행하고 있는데 그 이벤트가 IntegrationTestCase에서 발생했다고 주장하고 싶습니다. 나는 assertEventFired() 방법을 사용하여 시도하지만 오류 얻을 : 나는 이벤트 추적을 가능하게 $controller->eventManager()->setEventList(new EventList());을 수행하는 컨트롤러의 인스턴스를 얻을 수있는 방법이 표시되지 않습니다AssertEventFired에 IntegrationTestCase를 사용할 수 있습니까?

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

합니다.

IntegrationTestCase로이 작업을 수행 할 수 있습니까? 아니면 Cake\Controller\Controller의 코어 테스트 스위트에서 수동으로 컨트롤러를 빌드해야합니까?

CakePHP의 3.3.15

답변

1

당신은 오버라이드 (override) 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'); 
} 

보기