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

Laravel 8.x单元测试API返回404(Data Not Found)求助

问题排查与解决方法

1. 修正测试请求的路由

Laravel的Route::resource生成的index方法路由是**GET /api/user**,而非/api/user/index,你测试中请求的URL错误是导致404的直接原因之一。

修改测试代码中的请求地址:

$response = $this->withHeaders(['Authorization' => 'Bearer '. $token,
                'Accept' => 'application/json'])
                ->get('api/user'); // 移除末尾的/index

2. 为测试数据库填充用户数据

你使用了RefreshDatabase trait,每次测试都会重置数据库,导致测试运行时数据库为空。如果你的sendResponse方法会在数据为空时返回404(从错误信息可判断),必须在测试中创建测试用户。

修改测试代码,添加测试数据生成逻辑:

use App\Models\User; // 引入User模型

public function test_returns_user_data_list_successfully()
{
    // 创建3个测试用户
    User::factory()->count(3)->create();
    
    // 基于测试数据库中的用户生成有效Token(替换硬编码的无效Token)
    $testUser = User::first();
    // 若使用Laravel Sanctum:
    $token = $testUser->createToken('test-token')->plainTextToken;
    // 若使用tymon/jwt-auth:
    // $token = auth()->login($testUser);

    $response = $this->withHeaders(['Authorization' => 'Bearer '. $token,
                    'Accept' => 'application/json'])
                    ->get('api/user');

    $response->assertStatus(200);
    // 可选:断言返回的数据数量符合预期
    $response->assertJsonCount(3, 'data');
}

3. 修复控制器的查询逻辑

你的控制器代码存在语法错误:orderBy后不能直接调用all(),all()会忽略之前的查询条件,应改用get():

public function index()
{
    $user = User::orderBy('created_at', 'DESC')->get(); // 替换all()为get()
    $message = 'Success';
    return $this->sendResponse($user->makeVisible('role'), $message, 200);
}

4. 确认测试数据库配置

检查.env.testing中的数据库连接配置,确保指向正确的测试数据库,并运行测试数据库迁移:

php artisan migrate --env=testing

(若已使用RefreshDatabase trait,它会自动帮你完成迁移,无需手动执行)

5. 排查中间件响应逻辑

如果以上操作后仍返回404,检查auth.jwt中间件的代码,确认是否在认证失败时错误返回了404(正常应返回401 Unauthorized),若有则修正中间件的响应逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:40:26