如何使用Jest测试文件下载?

15

我有一些以下的代码:

/* global document */
/* global window */
/* global Blob */

import FileSaver from 'file-saver';

export const createDownloadFromBlob = (blob, filename, extension) => {
  FileSaver.saveAs(blob, `${filename}.${extension}`);
};

export const createDownload = (content, filename, extension) => {
  createDownloadFromBlob(new Blob([content], { type: 'application/octet-stream' }), filename, extension);
};

我想使用 Jest 对这两个方法进行单元测试,但我不知道从哪里开始。希望能得到任何帮助。

2个回答

33

我会使用spy来模拟FileSaver

import FileSaver from 'file-saver';
jest.mock('file-saver', ()=>({saveAs: jest.fn()}))

因为无法比较 Blob,所以我也会进行模拟:

global.Blob = function (content, options){return  ({content, options})}

现在您可以运行测试并像这样使用expect

createDownload('content', 'filename', 'extension')
expect(FileSaver.saveAs).toHaveBeenCalledWith(
  {content:'content', options: { type: 'application/octet-stream' }}, 
  'filename.extension'
)

感谢您的帮助! - zhuhan

1
在 TypeScript 中:如果您使用 ArrayBuffer 或二进制数据创建 Blob,则需要单独处理该情况,而不是字符串。
import * as CRC32 from 'crc-32';

(window as any).global.Blob = function(content, options) {
    // for xlxs blob testing just return the CRC of the ArrayBuffer
    // and not the actual content of it.
    if (typeof content[0] !== 'string') {
        content = CRC32.buf(content);
    }
    return {content: JSON.stringify(content), options};
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接