You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular单元测试Mock子组件报Multiple components match node错误如何解决

报错原因

错误Multiple components match node with tagname app-builder-navbar的核心触发逻辑是:测试模块中同一个选择器app-builder-navbar同时匹配到了两个组件:

  1. 你自定义声明的Mock组件MockBuilderNavbarComponent
  2. 导入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:42:03