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

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);
    }

排查建议

  1. 修正测试请求路径
    错误信息显示实际请求的是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');
    }
    
  2. 将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');
    
  3. 清除测试环境的路由缓存
    在测试的setUp方法中添加路由缓存清除操作,确保测试使用最新路由:

    use Illuminate\Support\Facades\Artisan;
    
    protected function setUp(): void
    {
        parent::setUp();
        Artisan::call('route:clear');
    }
    
  4. 验证测试环境的路由注册
    在测试方法中临时打印所有注册路由,确认/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:15:12