функция spyOn не вызывается - PullRequest
0 голосов
/ 14 октября 2019

У меня есть функция

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

1 Ответ

0 голосов
/ 14 октября 2019

Асинхронный вызов метода 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));
     });
 });
...