angular - Jasmine fakeAsync 滴答不等待承诺被解决
问题描述
Bellow 是我想要进行单元测试的一项小型服务(角度、茉莉花、业力),其目标是下载文件。所以我认为我应该检查的是是否FileSaver.saveAs
已被调用。正如您在函数'second'中看到的那样,有一个返回的承诺zip.generateAsync()
,我认为通过使用 fakeAsync 和 tick 我可以成功地等待它在代码到达之前完成expect(filesaver.saveAs).toHaveBeenCalledTimes(1)
。但是通过使用console.log,我验证了第二个函数在代码检查期望后终止,因此测试失败。
为什么使用 fakeAsync 和 tick() 测试无法等待 promise 被解决?
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);
}));
});
解决方案
监视所有函数并模拟它们:不要只监视要测试的函数。
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');
您的单元测试应该测试单个单元,并且您不应该依赖库实现。如果你模拟他们的功能,你只关注你自己的代码。
推荐阅读
- typescript - 如何正确键入泛型函数的参数?
- angular - Angular 6:未捕获(承诺):错误:StaticInjectorError(AppModule)[RoleGuardService]
- excel - 除非附加了调试器,否则 Excel 加载项性能不佳
- javascript - 通过 JavaScript 使用 Canvas,如何使圆圈移动到单击它的位置?
- c# - 尝试使用我的访问数据库更新我的 GridView 的 sum num 有问题
- asp.net - 在 Kendo Chart MVC 中格式化图例
- android - React Viro,单击很长时间以释放
- c# - 在多个元素之后添加 XML 元素
- objective-c - Dealloc NSString 导致崩溃
- python - GridSearchCV 信号量或锁释放次数过多