Laravel 7下PHPUnit测试首次请求返回404第二次成功问题求助
问题解决方案
1. 路由缓存问题
测试环境如果意外生成了路由/配置缓存,会导致第一次请求读取的是旧的路由表,第二次请求才加载新路由。
解决方法:运行命令清空所有缓存
php artisan config:clear php artisan route:clear php artisan cache:clear
同时确认phpunit.xml中没有开启路由缓存相关配置,测试环境不要使用路由缓存。
2. 路由匹配顺序错误
如果同路径层级下有带参数的通配符路由(比如/api/auth/{user})定义在/api/auth/login路由之前,第一次请求会优先匹配通配符路由,触发隐式模型绑定找不到对应模型,抛出NotFoundHttpException,部分场景下第二次请求会命中正确的静态路由。
解决方法:调整路由定义顺序,把静态路由放在参数路由之前:
// 静态路由优先定义 Route::post('/api/auth/login', [AuthController::class, 'login']); // 参数路由放在后面 Route::get('/api/auth/{user}', [AuthController::class, 'show']);
你可以执行php artisan route:list命令查看当前路由的排序,确认登录路由的优先级高于同路径下的参数路由。
3. 应用初始化逻辑顺序问题
如果你的RouteServiceProvider中路由前缀使用了动态配置,或者有服务提供者在boot阶段修改路由相关配置,会出现第一次请求时路由已注册完成,后续配置才修改的问题,导致第一次请求路径不匹配。
解决方法:
- 将路由前缀配置修改为静态值,避免动态读取运行时才生成的配置
- 将修改路由相关配置的逻辑从服务提供者的
boot方法迁移到register方法,保证路由注册前配置已生效 - 测试代码中在发送第一次请求前手动刷新应用实例,保证所有配置、路由都已正确加载:
public function test_login_interface() { // 手动刷新应用初始化所有配置 $this->refreshApplication(); $res = $this->json('post', '/api/auth/login', [ 'email' => $this->email, 'password' => $this->password ]); // 后续断言逻辑 }
4. 测试类初始化异常
确认你的测试类继承的TestCase的setUp方法正确调用了父级setUp方法,没有遗漏初始化逻辑。
内容的提问来源于stack exchange,提问作者Juan Pablo Pola Demoro
相关产品推荐
相关产品推荐

