【问题标题】:Is it possible to use IntegrationTestCase to assertEventFired?是否可以使用 IntegrationTestCase 来断言EventFired?
【发布时间】:2017-03-01 21:25:30
【问题描述】:

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

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

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

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

cakephp 3.3.15

【问题讨论】:

    标签: unit-testing cakephp cakephp-3.3


    【解决方案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');
    }
    

    另见

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 2016-01-18
      • 1970-01-01
      • 2013-03-18
      相关资源
      最近更新 更多