Жасмин FakeAsync тик не ждет обещание будет решено - PullRequest
0 голосов
/ 06 декабря 2018

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

1 Ответ

0 голосов
/ 06 декабря 2018

Шпион всех ваших функций и насмешка над ними: не просто следите за функцией, которую вы хотите проверить.

import * as JSZip from 'jszip/dist/jszip.min';
....
spyOn(JSZip.prototype, 'generateAsync').and.returnValue(Promise.resolve('some blob'));    
spyOn(JSZip.prototype, 'file');
spyOn(filesaver, 'saveAs');

Ваши модульные тесты должны тестировать один модуль, и вам не следует полагаться на реализации библиотек.Если вы издеваетесь над их функциями, вы сосредотачиваетесь только на своем собственном коде.

...