【问题标题】:spyOn function not called未调用 spyOn 函数
【发布时间】:2019-10-14 06:15:06
【问题描述】:

我有一个功能

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

并且已经嘲笑了fetchList return

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

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

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

            component.getList();

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

【问题讨论】:

  • 你能添加失败的原因吗?

标签: angular unit-testing karma-runner


【解决方案1】:

异步方法调用this.listFactory.fetchList()需要在你的单元测试中同步。使用来自@angular/core/testingfakeAsynctick,可以如下完成。

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));
     });
 });

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2021-11-03
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多