Laravel Livewire API接口PHPUnit测试返回NotFoundHttpException问题
问题:Laravel API在浏览器/Postman正常,但PHPUnit测试返回404
测试返回用户所有记录的API时遇到异常:接口在浏览器、Postman中均可正常返回JSON格式用户数据,但用PHPUnit功能测试时返回NotFoundHttpException(404错误)。
已尝试的排查操作:
- 调整路由顺序
- 将路由移至
routes/web.php - 执行
config:clear及清除缓存 - 使用/取消命名路由
但测试仍失败。
错误信息
user@server:/var/www/virtual-card$ sudo php artisan test --filter ApiBuzCardTest::the_api_return_all_users FAIL Tests\Feature\Livewire\Api\ApiBuzCardTest ⨯ the api return all users 0.08s ───────────────────────────────────────────── FAILED Tests\Feature\Livewire\Api\ApiBuzCardTest > the api return all users NotFoundHttpException GET https://server/virtual-card/api/users at vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:51 47▕ $handler = $this->container->make(ExceptionHandler::class); 48▕ 49▕ $handler->report($e); 50▕ ➜ 51▕ $response = $handler->render($passable, $e); 52▕ 53▕ if (is_object($response) && method_exists($response, 'withException')) { 54▕ $response->withException($e); 55▕ } +42 vendor frames 43 tests/Feature/Livewire/Api/ApiBuzCardTest.php:17 Tests: 1 failed (0 assertions) Duration: 0.12s
控制器文件(app/Http/Livewire/Api/ApiBuzCard.php)
<?php namespace App\Http\Livewire\Api; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; use Laravel\Jetstream\Features; use Illuminate\Http\Request; use Livewire\Component; class ApiBuzCard extends Component { public function getAllUsers() { $users = User::orderByDesc('id')->get()->toJson(JSON_PRETTY_PRINT); return response($users, 200); }
路由文件(routes/api.php)
<?php use App\Http\Livewire\Api\ApiBuzCard; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::get('users', [ApiBuzCard::class, 'getAllUsers'])->name('api.users'); Route::middleware('auth:sanctum') ->get('/user', function (Request $request) { return $request->user(); }); Route::get('user/{id}', [ApiBuzCard::class, 'getUser']); Route::post('users', [ApiBuzCard::class, 'createUser']) ->middleware('api'); Route::put('user/{id}', [ApiBuzCard::class, 'updateUser']) ->middleware('api'); Route::delete('user/{id}', [ApiBuzCard::class, 'deleteUser']) ->middleware('api');
测试文件(tests/Feature/ApiBuzCardTest.php)
<?php namespace Tests\Feature\Livewire\Api; use App\Http\Livewire\Api\ApiBuzCard; use App\Models\User; use Livewire\Livewire; use Tests\TestCase; class ApiBuzCardTest extends TestCase { /** @test */ public function the_api_return_all_users() { $this->withoutExceptionHandling(); $user = User::factory()->create(); $response = $this->get('/api/users'); $response->assertStatus(200); }
排查建议
修正测试请求路径
错误信息显示实际请求的是https://server/virtual-card/api/users,但测试代码中用的是/api/users,说明测试环境的APP_URL包含子路径/virtual-card。需要在测试中使用完整路径:$response = $this->get('/virtual-card/api/users');或者在测试类的
setUp方法中设置基础URL:protected function setUp(): void { parent::setUp(); $this->baseUrl = config('app.url'); }将API逻辑从Livewire组件移至普通控制器
Livewire组件设计用于交互式前端渲染,并非API接口实现。把API逻辑迁移到标准控制器(比如app/Http/Controllers/Api/UserController.php),再绑定路由:// routes/api.php use App\Http\Controllers\Api\UserController; Route::get('users', [UserController::class, 'getAllUsers'])->name('api.users');清除测试环境的路由缓存
在测试的setUp方法中添加路由缓存清除操作,确保测试使用最新路由:use Illuminate\Support\Facades\Artisan; protected function setUp(): void { parent::setUp(); Artisan::call('route:clear'); }验证测试环境的路由注册
在测试方法中临时打印所有注册路由,确认/api/users是否存在:/** @test */ public function the_api_return_all_users() { $this->withoutExceptionHandling(); // 打印所有路由到日志 foreach (Route::getRoutes() as $route) { info('Registered route: ' . $route->uri()); } $user = User::factory()->create(); $response = $this->get('/virtual-card/api/users'); $response->assertStatus(200); }查看
storage/logs/laravel.log确认路由是否正确注册。
内容的提问来源于stack exchange,提问作者Jamesson Cardozo
相关产品推荐
相关产品推荐

