Laravel测试:如何用Queue::assertPushed验证队列任务多次推送
Laravel 队列测试中校验指定任务推送次数的正确写法
原有写法失效原因
不带额外参数的Queue::assertPushed(目标任务类名)仅会校验「目标任务至少被推送过1次」,重复编写多条该语句只会重复执行「至少1次」的校验逻辑,只要任务实际推送次数≥1,无论写多少条断言都会通过,完全无法校验准确推送次数。
可直接使用的实现方案
- 最简次数校验:直接给
assertPushed传入期望次数作为第二参数Queue::assertPushed原生支持整数类型的第二参数,用来指定期望的任务推送总次数,写法最简洁:
// 先将队列替换为测试假实现 Queue::fake(); // 执行待测试的业务逻辑(比如调用接口、触发对应服务方法,过程中会分发队列任务) $this->post('/dispatch-batch-jobs'); // 断言SomeJob累计被推送了5次 Queue::assertPushed(\App\Jobs\SomeJob::class, 5);
- 带业务规则校验的次数断言
如果不仅要校验推送次数,还要校验每次推送的任务携带的参数、属性符合业务预期,可以把校验闭包作为第三参数传入,第二参数仍传期望次数:
Queue::assertPushed(\App\Jobs\SomeJob::class, 5, function ($job) { // 写自定义校验规则,比如校验任务绑定的用户ID正确、关联的订单状态符合要求 return $job->order->status === 'paid' && $job->targetUserId === 1001; });
- 自定义灵活校验
如果有更复杂的统计、分段校验需求,可以通过Queue::pushed()获取所有已推送的指定任务集合,自行编写断言逻辑,该写法对所有Laravel版本兼容:
$allPushedJobs = Queue::pushed(\App\Jobs\SomeJob::class); // 校验总推送次数 $this->assertCount(5, $allPushedJobs); // 可遍历集合做更灵活的校验,比如区分不同批次的任务属性
注意事项
- 必须保证
Queue::fake()的调用在业务逻辑执行之前,否则假实例无法捕获到任务推送记录,会导致断言结果不符合预期 - 如果使用的是低于6.x的Laravel版本,不支持直接传次数作为第二参数的话,直接用上述第三种自定义集合计数的方案即可
内容的提问来源于stack exchange,提问作者Petar Vasilev
相关产品推荐
相关产品推荐

