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

Laravel 11中Pest测试仅首次请求正常,后续返回404求助

问题分析与解决方案

这种情况大概率是Pest测试执行时,路由没有在每个测试用例前重新加载导致的——虽然PHPUnit默认会在每个测试前重置应用状态,但Pest的执行逻辑在Sail容器环境下,可能出现路由缓存未清除、应用状态未彻底重置的问题。

可能的原因

  • 测试环境意外启用了路由缓存,第一个测试加载路由后,后续测试无法重新初始化路由表
  • Pest的测试隔离机制在Sail容器中未完全生效,应用状态没有在测试间彻底重置

解决方法

方法1:在测试类中添加路由重置逻辑

在测试文件顶部添加beforeEach钩子,确保每个测试前都重新加载路由:

use Illuminate\Support\Facades\Route;

beforeEach(function () {
    // 清除缓存的路由
    Route::clearCachedRoutes();
    // 重新加载API路由文件
    $this->loadRoutesFrom(base_path('routes/api.php'));
});

it('test 1', function () {
    $this->get('api/v1/home')->assertStatus(200);
});

it('test 2', function () {
    $this->get('api/v1/home')->assertStatus(200);
});

方法2:确保测试环境禁用路由缓存

检查项目根目录的phpunit.xml文件,确认APP_ENV设置为testing,并使用内存缓存驱动避免持久化缓存影响:

<php>
    <server name="APP_ENV" value="testing"/>
    <server name="CACHE_DRIVER" value="array"/>
    <server name="SESSION_DRIVER" value="array"/>
    <server name="QUEUE_DRIVER" value="sync"/>
</php>

方法3:检查测试类继承关系

确保测试类正确继承Laravel的基础测试类,否则无法正确初始化应用环境:

namespace Tests\Feature\Api\Home;

use Tests\TestCase;

class HomeControllerTest extends TestCase
{
    // ... 测试方法
}

验证方式

修改后重新执行测试命令:

sail artisan test

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:31:04