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

如何在Job中使用Http::fake()进行测试?

测试Job中的HTTP请求(使用Http::fake())

要测试Job里的Http::post请求,核心是让Job在测试时同步执行,这样HTTP请求会立刻触发,才能被Http::fake()捕获并断言。以下是具体步骤:

1. 确保Job同步执行

Laravel默认Job是异步队列执行的,测试时必须让Job立刻运行,否则HTTP请求不会在测试流程中触发。有两种常用方式:

方式一:用dispatchSync()分发Job

直接使用同步分发方法,Job会立即执行:

dispatchSync(new YourTargetJob($payloadData));

方式二:全局设置队列驱动为sync

可以在测试类的setUp()方法里全局配置,这样所有Job都会同步执行:

protected function setUp(): void
{
    parent::setUp();
    $this->app['config']->set('queue.default', 'sync');
}

// 测试方法里正常分发Job即可
dispatch(new YourTargetJob($payloadData));

2. 伪造HTTP请求并断言

在分发Job前,先调用Http::fake()伪造目标接口的响应,之后断言请求是否符合预期:

public function test_job_triggers_correct_http_post()
{
    // 伪造目标API的响应
    Http::fake([
        // 匹配目标域名下的所有请求,返回模拟响应
        'your-external-api.com/*' => Http::response(['status' => 'ok'], 200),
    ]);

    // 同步分发Job
    dispatchSync(new YourTargetJob(['user_id' => 123]));

    // 断言HTTP请求是否按预期发送
    Http::assertSent(function ($request) {
        return $request->url() === 'https://your-external-api.com/user/notify'
            && $request->method() === 'POST'
            && $request['user_id'] === 123;
    });
}

额外提示

  • 如果Job包含延迟逻辑,测试时要确保延迟被跳过,或者结合Queue::fake()先验证Job是否被推送,再手动执行Job实例来触发HTTP请求。
  • 如果Job依赖其他服务(比如模型、仓库),记得在测试中提前模拟好这些依赖,避免测试依赖外部资源。

内容的提问来源于stack exchange,提问作者aaditya mundhalia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:57:20