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

