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
相关产品推荐
相关产品推荐

