Angular 15单元测试报错:无法匹配任何路由(URL段:'signin')
解决Angular 15单元测试中路由匹配'signin'失败的问题
错误提示Error: Cannot match any routes. URL Segment: 'signin'说明你的ExtensionListComponent在测试过程中触发了跳转到signin路径的逻辑,但当前测试模块的路由配置里未包含该路径,导致路由匹配失败。
以下两种方案可以解决这个问题:
方案一:添加signin路由的Stub配置
创建一个空的Stub组件用于占位,在测试路由配置中补充signin路径:
// 定义空的Stub组件,仅用于测试路由匹配 @Component({ template: '' }) class StubSigninComponent {} fdescribe('ExtensionListComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ RouterTestingModule.withRoutes([ { path: 'extensions-list', component: ExtensionListComponent }, { path: 'signin', component: StubSigninComponent } // 新增signin路由配置 ]), HttpClientTestingModule ], declarations: [ ExtensionListComponent, StubSigninComponent // 声明Stub组件 ], providers: [ TaskService ] }).compileComponents(); }); // 你的测试用例... });
方案二:模拟Router服务拦截导航请求
如果你不需要验证实际的路由跳转,只是想避免路由匹配错误,可以用模拟对象替换Router服务,拦截导航行为:
fdescribe('ExtensionListComponent', () => { let routerSpy: jasmine.SpyObj<Router>; beforeEach(() => { // 创建Router的模拟对象,监听navigate方法 routerSpy = jasmine.createSpyObj('Router', ['navigate']); TestBed.configureTestingModule({ imports: [ RouterTestingModule.withRoutes([ { path: 'extensions-list', component: ExtensionListComponent } ]), HttpClientTestingModule ], declarations: [ ExtensionListComponent ], providers: [ TaskService, { provide: Router, useValue: routerSpy } // 替换为模拟的Router ] }).compileComponents(); }); // 可选:验证组件是否触发了signin导航 it('should trigger signin navigation when required', () => { // 触发组件中跳转到signin的逻辑 // ... expect(routerSpy.navigate).toHaveBeenCalledWith(['/signin']); }); });
内容的提问来源于stack exchange,提问作者Sminu Soman
相关产品推荐
相关产品推荐

