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 测试,以确保所有单元都在单元测试中得到正确测试,并且可以真正互操作。
如果规范导致样板代码,可以通过适当的设置进一步改进,如图所示 。
我有一个带有顶级模块 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 测试,以确保所有单元都在单元测试中得到正确测试,并且可以真正互操作。
如果规范导致样板代码,可以通过适当的设置进一步改进,如图所示