茉莉花fakeAsync勾号不等待承诺解决

时间:2018-12-06 07:37:26

标签: angular unit-testing jasmine karma-jasmine

Bellow是一个小服务,我想对其进行单元测试(角度,茉莉花,因果报应),目的是下载文件。因此,我认为我应该检查的是是否已调用FileSaver.saveAs。如您在函数“第二个”中所看到的,zip.generateAsync()返回了一个承诺,我认为通过使用fakeAsync和tick,我可以成功地等待它完成,直到代码到达expect(filesaver.saveAs).toHaveBeenCalledTimes(1)为止。但是通过使用console.log,我验证了在检查代码是否符合预期之后第二个函数终止,并且因为该测试失败。

为什么通过使用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 :(得分:1)

监视所有功能并对其进行模拟:不要仅仅监视要测试的功能。

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

您的单元测试应该测试一个单元,并且您不应该依赖库的实现。如果模拟它们的功能,则只关注自己的代码。