Angular单元测试Mock子组件报Multiple components match node错误如何解决
报错原因
错误Multiple components match node with tagname app-builder-navbar的核心触发逻辑是:测试模块中同一个选择器app-builder-navbar同时匹配到了两个组件:
- 你自定义声明的Mock组件
MockBuilderNavbarComponent - 导入的
BuilderNavbarModule中自带的真实BuilderNavbarComponent
Angular渲染时无法确定该使用哪一个组件实现,因此抛出冲突错误。
最优修复方案
仅需要调整TestBed的配置,移除冗余的真实组件模块即可:
- 删掉测试模块imports数组中的
BuilderNavbarModule项:你已经自行实现了Mock子组件,不需要再导入包含真实子组件的模块,移除后组件冲突会直接消失。 - 如果后续测试不需要用到
BuilderBodyModule中的真实组件,也建议同步移除该模块并自行声明对应的Mock子组件,避免出现同类选择器冲突问题。 - 额外优化:你当前
ngOnInit测试用例的fakeAsync使用语法有误,没有正确包裹测试逻辑,修正后的写法参考:
it('should retrieve values from store', fakeAsync(() => { const fixture = TestBed.createComponent(BuilderComponent); const componentInstance = fixture.componentInstance; fixture.whenStable().then(() => { store.setState(initialState); expect(componentInstance['courseBuffer']).toBeDefined(); expect(componentInstance['courseName']).toBeDefined(); expect(componentInstance['selectedCourseContentElementUid']).toBeNull(); }); }));
修改后核心配置参考
await TestBed.configureTestingModule({ declarations: [BuilderComponent, MockBuilderNavbarComponent], imports: [ CommonModule, ToastrModule.forRoot(), ModalModule.forRoot(), QuillModule.forRoot(), EffectsModule.forRoot(), StoreModule.forRoot(reducers, { metaReducers, runtimeChecks: { strictActionImmutability: true, strictStateImmutability: true, }, }), StoreModule.forFeature('builder', fromBuilder.reducer), AngularFirestoreModule, AngularFireModule.initializeApp(environment.firebaseConfig), ReactiveFormsModule, DirectivesModule, TooltipModule, ModalsModule, ShellModule, SharedModule, // 已移除冲突的BuilderNavbarModule BuilderBodyModule, HttpClientModule, RouterTestingModule.withRoutes([ { path: 'preview', component: PreviewComponent }, { path: 'builder', component: BuilderComponent }, ]), ], providers: [ // 原有provider配置保持不变 provideMockStore({ initialState }), BuilderService, ToastrService, BsModalRef, UserService, QuillService, ], }).compileComponents();
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

