在不降低模板覆盖率的前提下进行测试

前端开发 2026-07-12

我正在使用带独立组件的Angular 21,以及Vitest(通过 @angular/build:unit-test)。

我有一个父级独立组件,它导入了一个子组件:

@Component({
  selector: 'app-child',
  standalone: true,
  template: `child`,
})
export class ChildComponent {}
@Component({
  selector: 'app-parent',
  standalone: true,
  imports: [ChildComponent],
  template: `
    <div>
      <app-child></app-child>
    </div>
  `,
})
export class ParentComponent {}

在我的测试中,我不想实例化真实的 ChildComponent,因此使用 overrideComponent 将其移除:

await TestBed.configureTestingModule({
  imports: [ParentComponent],
})
  .overrideComponent(ParentComponent, {
    remove: { imports: [ChildComponent] },
  })
  .compileComponents();

从功能上讲,这样做是可行的。

然而,当我这么做时,Vitest/V8报告中的 ParentComponent 的HTML模板覆盖率就消失了。看起来覆盖组件定义会阻碍对原始模板的正确打桩。

例如:

应用组件模板完全没有覆盖的示例

如果我不使用 overrideComponent,覆盖率就能正常工作。

在使用带独立组件的 overrideComponent 时,这是预期的行为吗?

有没有推荐的方式来:

  • 在测试中移除或模拟子组件;
  • 不重新定义父组件;以及
  • 不破坏模板覆盖报告?

还是说 overrideComponent 与像Vitest/V8这样的模板覆盖工具根本不兼容?

解决方案

这是一个已知问题,因为Vitest使用AOT编译。

https://github.com/angular/angular-cli/issues/30127

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章