上下文
我的问题是我的ngOnInit函数异步调用许多子函数,方法是使用Firestore从一个文档填充表单,以及订阅各种集合以显示数据列表 . 测试非常繁琐,因为我必须确保正确订阅,并以正确的顺序返回值 .
根据Angular docs:
但是,使用不依赖于Angular的独立单元测试来探索应用程序类的内部逻辑通常会更有效率 . 此类测试通常更小,更易于阅读,编写和维护 .
在我看来,这会阻止ngOnInit(通过 Spy )成为一种有效的方式
-
隔离测试和
-
初始化测试时降低复杂性
然后,您可以单独显式调用每个函数,只测试需要的函数,而不是让ngOnInit调用函数(也可以调用函数) .
这正是我到目前为止的方式:
组件
ngOnInit() {
console.log('init');
this.setup();
}
setup() {
this.firebaseService.setup(_ => {
this.checkNewOrEdit();
});
}
...
Spec
...
beforeEach(() => {
fixture = TestBed.createComponent(Component);
component = fixture.componentInstance;
spyOn(component, 'ngOnInit');
fixture.detectChanges();
});
it('should be created', () => {
fixture.whenStable().then(_ => {
expect(component).toBeTruthy();
});
});
it('should call checkNewOrEdit() on setup()',
() => {
spyOn(component, 'checkNewOrEdit');
callbackValue = 'success';
component.setup();
expect(component.checkNewOrEdit).toHaveBeenCalled();
}
);
到目前为止,这对我来说还算合适 .
Is this an acceptable solution? 或者有更好的方法来解决这个问题吗?
1 回答
在以前未设置的变量方面,我遇到了进一步的问题 .
这个解决方案确实有效,但它只会进一步增加复杂性 . 我建议最初解决问题,然后你不必担心以后设置的变量的方式和位置
我通过编辑我的firebase模拟来解决我的问题,以包括我在整个初始化链中订阅的所有集合和文档 . 我想我一定忘记了某个地方的文件或收藏品 .