首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jest:如何模拟esModule的方法?

Jest:如何模拟esModule的方法?
EN

Stack Overflow用户
提问于 2022-11-23 17:41:26
回答 2查看 50关注 0票数 1

我有一个简单的函数,它使用库jszip压缩一些文件夹和文件:

代码语言:javascript
运行
复制
// 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' });
};

我想通过监视folderfile的方法来测试它。我使用这个嘲弄部分策略来处理这个库的默认导出:

代码语言:javascript
运行
复制
// 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方法,正如您在以下错误消息中所看到的那样:

代码语言:javascript
运行
复制
    Message:
      zip.folder is not a function

      4 |   const zip = new Jszip();
      5 |
    > 6 |   zip.folder('folder')?.file('file.txt', 'just some text');

有人知道我怎么会嘲笑和监视这个方法吗?

看一看最小可重现性示例

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-24 09:01:01

通过让mockFolder@bln的答复中返回一个模拟的Jszip实例,我可以让它像预期的那样工作:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2022-11-23 21:24:36

代码语言:javascript
运行
复制
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()链,也许使用一些mockImplementationmockJszip周围

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74550996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档