spyOn函数未调用

时间:2019-10-14 06:15:06

标签: angular unit-testing karma-runner

我有一个功能

getList() {
        return this.listFactory
            .fetchList()
            .then((data) => this.generateDsisplay(data));
}

并且已经嘲笑fetchList返回

mocktListRepository.fetchList.and.returnValue(PromiseUtil.transformAsResolvedPromise(listPage));

但是在我的单元测试中仍然失败。我不知道为什么。测试将调用generateDsisplay

describe('getList()', () => {
        it('should call generateDsisplay', () => {           
            spyOn(component, 'generateDsisplay');

            component.getList();

            expect(component.generateDsisplay).toHaveBeenCalled();
        });
    });

1 个答案:

答案 0 :(得分:0)

在您的单元测试中,异步方法调用this.listFactory.fetchList()需要进行同步。使用fakeAsync中的tick@angular/core/testing,可以按照以下步骤进行操作。

import { fakeAsync, tick} from '@angular/core/testing';
describe('getList()', () => {
    it('should call generateDsisplay', fakeAsync(() => {           
        spyOn(component, 'generateDsisplay');

        component.getList();
        tick();

        expect(component.generateDsisplay).toHaveBeenCalled();
    }));
});

或者,您也可以按以下方式尝试async/await

 describe('getList()', () => {
     it('should call generateDsisplay', async () => {           
         spyOn(component, 'generateDsisplay');

         await component.getList();

         expect(component.generateDsisplay).toHaveBeenCalled();
     });
 });

再次使用done回调。

 describe('getList()', () => {
     it('should call generateDsisplay', (done) => {           
         spyOn(component, 'generateDsisplay');

         component.getList()
             .then(data => {
                 expect(component.generateDsisplay).toHaveBeenCalled();
                 done();
             })
             .catch(err => fail(err));
     });
 });