Laravel单元测试修改配置后如何保留配置值并重载路由
解决方案
你遇到的问题本质是路由在应用启动阶段就完成了注册,后续修改配置不会触发路由重新注册,而refreshApplication会重置所有应用配置导致修改失效,可通过以下两种方式解决:
方法1:刷新应用后先改配置再重载路由
这是最简便的方案,代码示例如下:
public function test_registration_screen_can_be_rendered() { // 先重置应用到初始状态 $this->refreshApplication(); // 重置完成后再修改配置,此时修改不会被重置 config()->set('auth.allow_registration', true); // 手动重新加载条件判断所在的路由文件 \Route::loadRoutesFrom(base_path('routes/auth.php')); // 发起请求断言 $response = $this->get('/register'); $response->assertStatus(200); }
方法2:不刷新应用,直接清空现有路由后重载
如果需要保留当前应用的其他自定义状态,可以用这种方案:
public function test_registration_screen_can_be_rendered() { // 先修改目标配置 config()->set('auth.allow_registration', true); // 清空已注册的所有路由 app('router')->setRoutes(new \Illuminate\Routing\RouteCollection); // 重新加载项目所有路由文件,和框架启动逻辑保持一致 $this->loadProjectRoutes(); // 发起请求断言 $response = $this->get('/register'); $response->assertStatus(200); } // 可抽为公共方法,供多测试用例复用 protected function loadProjectRoutes() { \Route::loadRoutesFrom(base_path('routes/web.php')); \Route::loadRoutesFrom(base_path('routes/auth.php')); // 其他用到的路由文件按项目实际情况补充即可 }
注意事项
测试环境请确保关闭路由缓存,否则路由重载逻辑不会生效,Laravel测试环境默认未开启路由缓存,只要你没有手动在测试环境执行route:cache命令就无需额外处理。
内容的提问来源于stack exchange,提问作者Yevgeniy Afanasyev
相关产品推荐
相关产品推荐

