是否可以使用 IntegrationTestCase 来断言 EventFired?
Is it possible to use IntegrationTestCase to 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
您可以在重写的 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');
}
另见
我正在从我的控制器中触发一个事件,我想断言它是在 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
您可以在重写的 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');
}
另见