You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:42:51