spec 文件中的组件声明,而不是将顶级模块加载到 TestBed 中

Component declaration in spec files as opposed to loading the top-level module into TestBed

我有一个带有顶级模块 AppModule 的 Angular (4.x) 应用程序,它声明了几个自定义组件,因此它们可以在模板中使用。

但是,对于 jasmine/karma 测试,最常见的方法似乎是使用 BrowserDynamicTestingModule 并在 beforeEach 期间声明任何必需的自定义组件,例如:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [ MyComponent, SomeDependedUponComponent ]
  })
  .compileComponents();
}));

考虑到我们无论如何都在模拟主应用程序的环境,为什么不直接用 AppModule 初始化 testBed,这样每个自定义组件都可用于所有测试?类似于:

getTestBed().initTestEnvironment(
  [BrowserDynamicTestingModule, AppModule],
  platformBrowserDynamicTesting()
);

如果我没有遗漏什么,这更接近于主应用程序的设置,甚至减少了单个 spec/test 文件中的样板代码。还是有任何缺点,例如性能损失?

上述方法是错误的,因为这样的测试实际上是集成测试,而它们应该是单元测试。

单元测试的目的是测试单个单元。添加额外的移动部件会阻止它被孤立地测试,并且在其中一个单元出现故障时使问题解决变得复杂。在没有 TestBed 的情况下 isolated unit tests 可以改进隔离,尽管 TestBed 仍然是测试 DI 注释所必需的。

此方法还需要提供 integration/e2e 测试,以确保所有单元都在单元测试中得到正确测试,并且可以真正互操作。

如果规范导致样板代码,可以通过适当的设置进一步改进,如图所示