如何在 laravel 中向手动注册事件监听器添加测试?

Posted

技术标签:

【中文标题】如何在 laravel 中向手动注册事件监听器添加测试?【英文标题】:How to add test to Manually Registering Events Listener in laravel? 【发布时间】:2020-10-18 10:21:49 【问题描述】:

我有一个手动注册的事件和相关的监听器。为此,我想添加测试,所以我在文档中检查了 laravel Mocking Test,但我没有找到任何方法来测试使用参数侦听器手动注册事件。所以有人帮我怎么做吗?下面我附上了工作相关的代码。

事件正在TeamObserver deleting 方法中调用,如下所示

class TeamObserver

    public function deleting(Team $team)
    
    event('event.team.deleting', array('team' => $team));
    

事件和监听器注册在EventServiceProvider boot 方法中,如下所示

public function boot()

    parent::boot();
    Event::listen(
        'event.team.deleting',
        'Listeners\TeamDeletingListener'
    );

TeamDeletingListener 如下所示

class TeamDeletingListener

    public function handle($team)
    
        \Log::info('Deleting Inventory Module');
        \Log::info($team);
    

【问题讨论】:

嘿任何精灵???? 你想“单元”测试吗?如果是,你想用哪种方法?如果是集成或功能,您要从哪里测试到哪里? 是的,我想测试单元测试功能。从观察者删除事件到监听器。主要是我想测试我收到正确的值。例如上面的$team. 我的回答对你有帮助吗,@Dev?如果没有,你能告诉我缺少什么吗? 【参考方案1】:

执行此操作的最简单方法是将侦听器的实际实现替换为模拟的实现。这是一个示例测试。如果您删除 event('event.team.deleting', array('team' => $team)); 或通过其他团队,它将失败。如果我说对了,那就是你想要达到的目标。

public function testTeamDeletion()

    // Persist team that should be deleted
    $team       = new Team();
    $team->name = 'My Team';
    $team->save();

    // Mock the listener
    $this->mock(
        TeamDeletingListener::class,
        function (MockInterface $mock) use ($team) 
            // Expectation
            $mock->shouldReceive('handle')
                ->with($team)
                ->once();
        
    );

    // Delete team
    $team->delete();

【讨论】:

以上是关于如何在 laravel 中向手动注册事件监听器添加测试?的主要内容,如果未能解决你的问题,请参考以下文章

在 AS3 中向子影片剪辑添加/删除事件侦听器

Laravel6使用事件监听发送消息通知

Laravel6使用事件监听发送消息通知

Laravel6使用事件监听发送消息通知

Laravel6使用事件监听发送消息通知

Laravel 5.2:如何从自己的事件监听器访问请求和会话类?