我的问题是我的ngOnInit函数异步调用许多子函数,方法是使用Firestore从一个文档填充表单以及订阅各种集合以显示数据列表。测试非常繁琐,因为我必须确保正确订阅,并以正确的顺序返回值。
根据Angular docs:
但是,使用不依赖于Angular的独立单元测试来探索应用程序类的内部逻辑通常会更有效率。这些测试通常更小,更易于阅读,编写和维护。
我认为这会阻止ngOnInit(通过间谍)成为有效的方式
隔离测试和
初始化测试时降低复杂性
然后,您可以单独显式调用每个函数,只测试需要的函数,而不是让ngOnInit调用函数(也可以调用函数)。
到目前为止,这正是我的目标:
ngOnInit() {
console.log('init');
this.setup();
}
setup() {
this.firebaseService.setup(_ => {
this.checkNewOrEdit();
});
}
...
...
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();
}
);
到目前为止,这对我来说还不错。
这是一个可以接受的解决方案吗?还是有更好的方法来解决这个问题吗?
答案 0 :(得分:0)
在先前未设置的变量方面,我遇到了进一步的问题。
这个解决方案确实有效,但它只会进一步增加复杂性。我建议最初解决问题,然后你不必担心以后设置的变量的方式和位置
我通过编辑我的firebase模拟来解决我的问题,以包括我在整个初始化链中订阅的所有集合和文档。我想我一定忘记了某个地方的文件或收藏品。