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

Laravel PHPUnit测试调用API返回404错误求助

Laravel PHPUnit测试调用API返回404但路由已定义的排查方案

问题说明

在Laravel项目中编写PHPUnit测试用例调用API接口时,始终返回404错误,但对应的API路由已定义。相关代码如下:

测试函数代码

public function test_can_update_integration()
{

    $integrationArr = ['hepsiburada', 'getir', 'trendyol'];
    $index = rand(0 , count($integrationArr) -1);

    $data = [
        'integration' => $integrationArr[$index],
        'username' => $this->faker->word,
        'password' => $this->faker->word,
        'id' => 1
    ];

    Passport::actingAs(
        User::factory()->create()
    );

    $response = $this->putJson(route('integration.edit'), $data);

    $response->assertStatus(201);
}

API路由代码

Route::group(['middleware' => 'auth:api'], function(){

 Route::group(['prefix' => 'integration'], function () {
    Route::get('/list', [IntegrationController::class, 'list'])->name('integration.list');
    Route::post('/store', [IntegrationController::class, 'store'])->name('integration.store');
    Route::put('/update', [IntegrationController::class, 'update'])->name('integration.edit');
    Route::delete('/delete', [IntegrationController::class, 'delete'])->name('integration.del');
 });
});

排查方向

  • 验证路由加载状态:在测试中临时添加dd(Route::getRoutes())打印所有已加载路由,确认integration.edit对应的PUT /integration/update路由存在,且没有被其他路由规则覆盖。
  • 替换路由助手函数测试:暂时用完整URL替代route()助手,比如调用$this->putJson('/api/integration/update', $data),如果请求成功,说明路由命名存在冲突或助手函数调用异常。
  • 排查Passport认证影响:临时注释路由组的auth:api中间件,重新运行测试。如果此时不再返回404,说明测试环境的Passport配置有问题,导致认证拦截时返回了异常的404而非标准401。
  • 清理路由缓存:测试环境若开启了路由缓存,新添加的路由不会生效。执行php artisan route:clear清除缓存后再运行测试。
  • 检查请求方法匹配:虽然测试用了putJson对应路由的PUT方法,但可以打印$response->getContent()查看详细错误信息,确认是否存在请求方法被服务器配置篡改的情况。
  • 核对控制器方法签名:检查IntegrationController的update方法签名是否与路由匹配,确保没有额外的必填参数导致路由匹配失败。

内容的提问来源于stack exchange,提问作者Mustafa UYSAL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:25:05