Bellow - это небольшой сервис, который я хочу пройти модульное тестирование (angular, jasmine, karma), целью которого является загрузка файла.Поэтому я подумал, что я должен проверить, если FileSaver.saveAs
был вызван.Как вы можете видеть в функции 'second', zip.generateAsync()
возвращает обещание, которое я подумал, что с помощью fakeAsync и tick я могу успешно дождаться его завершения до того, как код достигнет expect(filesaver.saveAs).toHaveBeenCalledTimes(1)
.Но с помощью console.log я убедился, что функция second завершается после проверки кода на ожидание, и из-за этого тест не проходит.
Почему с помощью теста fakeAsync и tick () не удается дождаться выполнения обещания?
someclass.service.ts
import { Injectable } from '@angular/core';
import * as FileSaver from 'file-saver/FileSaver.js';
import * as JSZip from 'jszip/dist/jszip.min';
@Injectable()
export class SomeClass {
method2(input: any){
const blobPart = JSON.stringify(input);
const zip = new JSZip();
zip.file('data', blobPart);
zip.generateAsync({ type: 'blob' })
.then( blob => {
FileSaver.saveAs(
blob,
'randomName.dfnx'
);
});
}
method1(){
x = 'whatever';
this.method2(x);
}
}
someclass.service.spec.ts
import {TestBed, fakeAsync, tick} from '@angular/core/testing';
import {SomeClass} from './someclass.service';
const filesaver = require('file-saver/FileSaver');
describe ('Test', () => {
let service: SomeClass;
beforeEach( () => {
TestBed.configureTestingModule({
providers: [SomeClass]
});
service = TestBed.get(SomeClass);
spyOn(filesaver, 'saveAs').and.callThrough();
});
it('Test', fakeAsync( () => {
service.method1();
tick();
expect(filesaver.saveAs).toHaveBeenCalledTimes(1);
}));
});