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

时间:2017-10-23 09:00:34

标签: javascript angular unit-testing angular2-testing

上下文

我的问题是我的ngOnInit函数异步调用许多子函数,方法是使用Firestore从一个文档填充表单以及订阅各种集合以显示数据列表。测试非常繁琐,因为我必须确保正确订阅,并以正确的顺序返回值。

根据Angular docs

  

但是,使用不依赖于Angular的独立单元测试来探索应用程序类的内部逻辑通常会更有效率。这些测试通常更小,更易于阅读,编写和维护。

我认为这会阻止ngOnInit(通过间谍)成为有效的方式

  1. 隔离测试和

  2. 初始化测试时降低复杂性

  3. 然后,您可以单独显式调用每个函数,只测试需要的函数,而不是让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();
        }
    );
    

    到目前为止,这对我来说还不错。

    这是一个可以接受的解决方案吗?还是有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

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

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