如何测试事件是否在模型方法中分派

How can I test if an event is dispatched in a model method

我正在用 phpunit 为我的 cakephp 模型编写单元测试。我的模型发送这样的事件:

private function __dispatchEmailEvent(){
        $Event = new CakeEvent(
            'Model.Order.afterSaveCustomersOrder',
            $this,
            array()
        );
        $this->getEventManager()->dispatch($Event);
    }

我可以在我的测试函数中写什么来检查这个事件是否被正确发送?

public function testEventDispatched(){

}

有多种方法...我个人最常用的一种是注册监听器并修改引用变量,可以在调用触发事件的动作后进行测试,例如

$model = ClassRegistry::init('TableName');

$dispatched = false;
$model->getEventManager()->attach(
    function (CakeEvent $event) use ($model, &$dispatched) {
        $this->assertSame($model, $event->subject());
        $this->assertEquals([], $event->data);
        $dispatched = true;
    },
    'Model.Order.afterSaveCustomersOrder'
);

$model->invokeWhateverTriggersTheEvent();
$this->assertTrue($dispatched);

* 未经测试,至少需要 PHP 5.4