You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Jasmine测试Promise封装的FileReader错误分支?

如何在Jasmine中覆盖FileReader错误分支的测试覆盖率?

待测试的Base64转换函数

export const fileToBase64 = (file: File | Blob): Promise<any> =>
  new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
  });

已有测试用例

describe('getFileBase64()', () => {
  it('should convert file to base64', async () => {
    const blob = new Blob();
    const result = await getFileBase64(blob);
    expect(result).toBe('data:');
  });

  it('should reject', async () => {
    ???
  });
});

错误分支测试方案

要覆盖reader.onerror分支,需要手动模拟FileReader触发错误事件的场景,具体实现如下:

describe('getFileBase64()', () => {
  // 注意:如果原函数名是fileToBase64,这里测试的函数名要保持一致,避免笔误
  it('should convert file to base64', async () => {
    const blob = new Blob();
    const result = await fileToBase64(blob);
    expect(result).toBe('data:');
  });

  it('should reject when FileReader encounters an error', async () => {
    const mockError = new Error('File read failed');
    let readerInstance: any;

    // 拦截FileReader构造,返回带方法和事件钩子的模拟实例
    spyOn(window, 'FileReader').and.callFake(() => {
      readerInstance = {
        readAsDataURL: jasmine.createSpy('readAsDataURL'),
        onerror: null
      };
      return readerInstance;
    });

    // 启动转换Promise但暂不等待
    const conversionPromise = fileToBase64(new Blob());

    // 手动触发FileReader的error事件
    readerInstance.onerror(mockError);

    // 验证Promise是否按预期抛出错误
    await expectAsync(conversionPromise).toBeRejectedWith(mockError);
  });
});

说明

  • 通过spyOn(window, 'FileReader').and.callFake()拦截原生FileReader的构造逻辑,返回一个可控的模拟实例
  • 保存模拟实例的引用,在启动转换Promise后手动调用onerror方法传入模拟错误,触发函数的reject分支
  • 使用expectAsync配合toBeRejectedWith可以精准验证Promise的拒绝结果

内容的提问来源于stack exchange,提问作者W. Zhong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:10:28