【发布时间】:2016-10-20 14:17:23
【问题描述】:
这是我在每个单元测试之前的块。它工作得很好,为每个测试提供了一个新的组件实例。但是,执行 beforeEach 块大约需要 4 秒。当你有 200 次测试时,这很慢!
我想将大部分代码移动到 beforeAll 块(如果您使用 Jasmine done() 回调而不是使用异步,这将有效)但我仍然无法为每个测试创建一个新实例。某些测试失败是因为唯一的实例已被先前的测试篡改。
我该怎么...
- 创建一个新的组件实例,而无需为每个测试执行这个耗时的代码。
或
- 将实例重置为未篡改状态。
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [AppModule],
providers: [{provide: APP_BASE_HREF, useValue: '/'},
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: (pBackend: MockBackend, pOptions: BaseRequestOptions) => {
return new Http(pBackend, pOptions);
},
deps: [MockBackend, BaseRequestOptions]
}]
}).compileComponents()
.then(() => {
fix = TestBed.createComponent(Route1DetailComponent);
instance = fix.componentInstance;
injector = fix.debugElement.injector;
});
}));
【问题讨论】:
-
也许
AppModule是问题所在。只需添加测试实际需要的内容即可尝试。就个人而言,我从不使用 AppModule 进行单元测试。在进行单元测试时,我尽量减少所有外部变量。 -
这取决于为什么需要这么长时间。但是关于单元测试和模块的事情是只有当前单元所属的模块应该被引导。
-
+1 感谢你们,我理解并同意我的方法可能会更好 - 但我仍然不高兴你必须再次重新加载所有导入以获得新的实例已经加载的组件,对我来说似乎不对
-
这是单元测试的目的。以前的测试不应该有机会影响当前的测试,但是如果将
beforeEach替换为beforeAll,就会发生这种情况。 -
仅供参考,
beforeAll不起作用的原因是角度测试基础架构使用全局beforeEach重置了TestBed;可以看到注册了here。
标签: unit-testing angular