ES6 类的 jest.mock 产生 ReferenceError: require is not Defined

Dan*_*iel 9 javascript jestjs es6-modules

我正在尝试在我的 ES6 javascript 项目中使用 jest 创建一个自动模拟。

我正在ubuntu 上使用 nodev15.0.1和 jest 。26.6.018.04.5

我有一个包含以下代码的测试文件:

import RenderBuffer from './renderbuffer.js'

jest.mock('./renderbuffer.js');

beforeEach(() => {
    RenderBuffer.mockClear();
});
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我遇到以下问题:

ReferenceError: require is not defined

      4 | 
      5 | beforeEach(() => {
    > 6 |     RenderBuffer.mockClear();
        |       ^
      7 | });
      8 | 
Run Code Online (Sandbox Code Playgroud)

这个错误让我感到惊讶,因为我没有使用 require 语句。

我的 package.json 配置包含以下内容:

"type": "module",
    "main": "src/index.js",
    "devDependencies": {
        "jest": "^26.5.3",
        "jest-canvas-mock": "^2.3.0"
    },
    "jest": {
        "setupFiles": ["jest-canvas-mock"]
    },
    "scripts": {
        "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
        "test-coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage"
    }
Run Code Online (Sandbox Code Playgroud)

关于这个问题的根本原因是什么有什么想法吗?

Ezz*_*zze 9

您必须禁用任何源代码转换才能通过设置使其工作

{
  transform: {}
}
Run Code Online (Sandbox Code Playgroud)

在你的 Jest 配置文件中。默认情况下,转换选项配置为使用babel-jest. 请参阅Jest 文档部分了解更多详细信息。另请注意,您应该jest显式导入:

import { jest } from '@jest/globals';
Run Code Online (Sandbox Code Playgroud)

不幸的是,正如其他评论者已经提到的那样,运行测试时仍然可能存在一些问题。也许,人们应该关注此问题,以跟踪 Jest 中为 ESM 支持所做的更改。

例如,我目前不幸模拟静态模块导入(版本26.6.2):

开玩笑。(do|un)mock

由于 ESM 在评估模块时有不同的“阶段”,因此 jest.mock 不适用于静态导入。不过它可以用于动态导入,所以我认为我们只需要在文档中明确它支持什么和不支持什么。

jest.mock 调用被提升,但这对 ESM 没有帮助。我们可能会考虑将 import 'thing' 转换为 import('thing') ,这应该允许提升工作,但它是异步的。使用顶级等待可能是这种方法的必要条件。我还认为它的侵入性足以保证一个单独的选择。需要讨论的事情 - 我们不需要支持 jest.mock 初始版本所能提供的一切。