我有一个简单的函数,它使用库jszip压缩一些文件夹和文件:
// app.ts
const runJszip = async (): Promise<void> => {
const zip = new Jszip();
zip.folder('folder')?.file('file.txt', 'just some text');
zip.file('file.txt', 'just some text');
await zip.generateAsync({ type: 'blob' });
};
我想通过监视folder
和file
的方法来测试它。我使用这个嘲弄部分策略来处理这个库的默认导出:
// app.test.ts
import { runJszip } from './app';
const mockFile = jest.fn();
const mockFolder = jest.fn();
const mockJszip = jest.fn().mockImplementation(() => {
return {
folder: mockFolder,
file: mockFile,
};
});
jest.mock('jszip', () => {
return jest.fn().mockImplementation(() => ({
__esModule: true,
default: mockJszip,
}));
});
test('jszip', async () => {
await runJszip();
expect(mockFile).toHaveBeenCalledTimes(2);
expect(mockFolder).toHaveBeenCalledTimes(1);
});
不幸的是,我似乎无法正确地模拟folder
方法,正如您在以下错误消息中所看到的那样:
Message:
zip.folder is not a function
4 | const zip = new Jszip();
5 |
> 6 | zip.folder('folder')?.file('file.txt', 'just some text');
有人知道我怎么会嘲笑和监视这个方法吗?
看一看最小可重现性示例。
发布于 2022-11-24 09:01:01
通过让mockFolder
在@bln的答复中返回一个模拟的Jszip实例,我可以让它像预期的那样工作:
import { runJszip } from './app';
const mockFile = jest.fn();
let mockFolder: jest.Mock;
function mockJszip() {
mockFolder = mockFolder ?? jest.fn(mockJszip);
return {
folder: mockFolder,
file: mockFile,
generateAsync: jest.fn(),
};
}
jest.mock('jszip', () => {
return {
__esModule: true,
default: mockJszip,
};
});
test('jszip', async () => {
await runJszip();
expect(mockFile).toHaveBeenCalledTimes(2);
expect(mockFolder).toHaveBeenCalledTimes(1);
});
https://stackblitz.com/edit/webpack-5-react-starter-ofxcmy?file=src/app.test.ts
发布于 2022-11-23 21:24:36
import { runJszip } from './app';
const mockFile = jest.fn();
const mockFolder = jest.fn();
function mockJszip() {
return {
folder: mockFolder,
file: mockFile,
generateAsync: jest.fn(),
};
}
jest.mock('jszip', () => {
return {
__esModule: true,
default: mockJszip,
};
});
test('jszip', async () => {
await runJszip();
expect(mockFile).toHaveBeenCalledTimes(2);
expect(mockFolder).toHaveBeenCalledTimes(1);
});
对于?.file()
链,也许使用一些mockImplementation
在mockJszip
周围
https://stackoverflow.com/questions/74550996
复制相似问题