ES6类的jest.mock产生ReferenceError:require未定义

时间:2020-10-28 23:14:08

标签: javascript jestjs es6-modules

我正在尝试在我的ES6 javascript项目中使用玩笑来创建自动模拟。

我正在使用节点v15.0.1,并在ubuntu 26.6.0上使用玩笑18.04.5

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

import RenderBuffer from './renderbuffer.js'

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

beforeEach(() => {
    RenderBuffer.mockClear();
});

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

ReferenceError: require is not defined

      4 | 
      5 | beforeEach(() => {
    > 6 |     RenderBuffer.mockClear();
        |       ^
      7 | });
      8 | 

由于我没有使用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"
    }

关于此问题的根本原因有什么想法?

1 个答案:

答案 0 :(得分:0)

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

{
  transform: {}
}
Jest配置文件中的

。默认情况下,transform选项配置为使用babel-jest。有关更多详细信息,请参阅this Jest documentation section。另外请注意,您应该显式导入jest

import { jest } from '@jest/globals';

不幸的是,就像其他评论者已经提到的那样,它在运行测试时仍然会遇到一些问题。可能应该follow this issue来跟踪Jest中为ESM支持所做的更改。

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

开玩笑。(不要做)

由于ESM在评估模块时具有不同的“阶段”,因此jest.mock无法用于静态导入。不过,它可以用于动态导入,因此我认为我们必须在文档中明确说明支持什么以及不支持什么。

jest.mock调用被挂起,但这在ESM中无济于事。我们可能会考虑将导入“事物”转换为import('thing'),这应允许提升工作,但随后是异步的。这种方法可能需要使用顶级等待。我还认为它具有足够的侵入性,因此有必要提供单独的选择。有待讨论的事情-我们不需要为初始发行版提供jest.mock的所有支持。