【问题标题】:How can I test if an event is dispatched in a model method如何测试是否在模型方法中分派了事件
【发布时间】:2016-03-05 07:13:01
【问题描述】:

我正在为我的 cakephp 模型使用 phpunit 编写单元测试。我的模型调度一个这样的事件:

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

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

public function testEventDispatched(){

}

【问题讨论】:

    标签: cakephp phpunit cakephp-2.0


    【解决方案1】:

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

    $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

    【讨论】:

    • 这是正确的。测试用例的名称应该类似于 testEventDispatchedAfterSave(),以及触发器 $model->afterSave()。
    猜你喜欢
    • 2017-12-15
    • 2020-10-30
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多