PestPHP测试中Job抛出的CallSlimException未被预期捕获
解决Laravel中AnalyzerCallJobV1异常测试断言失败的问题
问题原因
核心问题是AnalyzerCallJobV1的handle方法内部通过try-catch捕获了CallSlimException,并调用handleException做内部处理,没有把异常抛到测试代码的上下文里——哪怕Ray已经显示异常确实触发了,测试中的$this->expectException()也抓不到这个异常。
可行解决方案
1. 验证异常处理后的行为(推荐)
既然Job已经把异常吞了,不如直接测试它处理异常后的实际业务动作,比如日志记录、数据状态变更:
// Fake日志组件 Log::fake(); // 触发目标Job AnalyzerCallJobV1::dispatch($yourParams); // 断言是否生成了对应异常的错误日志 Log::assertLogged(function ($level, $message, $context) { return $level === 'error' && isset($context['exception']) && $context['exception'] instanceof CallSlimException; });
2. 测试环境下重新抛出异常
如果一定要用expectException断言,可以在Job的异常处理逻辑里加个测试环境判断,把异常重新抛出来:
public function handle() { try { // 原有调用CallAnalyzerAction的业务逻辑 $this->callAnalyzerAction->execute(); } catch (CallSlimException $e) { $this->handleException($e); // 测试环境下重新抛出,让测试能捕获 if (app()->environment('testing')) { throw $e; } } }
修改后,测试里的$this->expectException(CallSlimException::class);就能正常生效。
3. 单独测试CallAnalyzerAction的异常逻辑
Job的核心是调用CallAnalyzerAction,你可以跳过Job,直接测试Action的异常抛出逻辑,确保它在API返回500时确实会抛出CallSlimException:
$this->expectException(CallSlimException::class); // 模拟API返回500错误 Http::fake([ '*' => Http::response([], 500), ]); // 直接实例化并调用Action app(CallAnalyzerAction::class)->execute($yourParams);
内容的提问来源于stack exchange,提问作者abkrim
相关产品推荐
相关产品推荐

