首页 文章

Angular 2测试:在beforeEach上监视ngOnInit()?

提问于
浏览
0

上下文

我的问题是我的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 回答

  • 0

    在以前未设置的变量方面,我遇到了进一步的问题 .

    这个解决方案确实有效,但它只会进一步增加复杂性 . 我建议最初解决问题,然后你不必担心以后设置的变量的方式和位置

    我通过编辑我的firebase模拟来解决我的问题,以包括我在整个初始化链中订阅的所有集合和文档 . 我想我一定忘记了某个地方的文件或收藏品 .

相关问题