简体   繁体   English

如何用 Jasmine 测试 promise 包装的 fileReader?

[英]How to test the promise wrapped fileReader with Jasmine?

I am trying to get testing coverage for a base64 function like below:我正在尝试获取 base64 function 的测试覆盖率,如下所示:

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 () => {
      ???
    });
  });

在此处输入图像描述

I already Googled some ways but had no luck, like spyOn(window, 'FileReader') .我已经用谷歌搜索了一些方法但没有运气,比如spyOn(window, 'FileReader')

How should I make the coverage for line "reader.onerror = error => reject(error);"我应该如何覆盖行“reader.onerror = error => reject(error);” in Jasmine?在 Jasmine?

This is a solution inspired by: https://stackoverflow.com/a/67061047/8543478这是一个解决方案,灵感来自: https://stackoverflow.com/a/67061047/8543478

In order to access the reader, we can mock the FileReader constructor and get control of the created file reader instance.为了访问读取器,我们可以模拟 FileReader 构造函数并控制创建的文件读取器实例。

Please check the comments in the code sample to see how I can able to trigger onerror .请查看代码示例中的注释,了解我如何能够触发onerror


    it('should reject', async () => {
      const reader = new FileReader();
      const eventError = new Event('error');

      // When load event hit, trigger "onerror" event for rejection
      reader.addEventListener('load', () => reader.dispatchEvent(eventError));

      // Replace the FileReader constructor with the instance that defined above
      spyOn(window, 'FileReader').and.returnValue(reader);

      await expectAsync(getFileBase64(new Blob())).toBeRejectedWith(eventError);
    });

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM