【问题标题】:jest.mock of ES6 class yields ReferenceError: require is not definedES6 类的 jest.mock 产生 ReferenceError: require is not defined
【发布时间】:2020-11-04 00:51:39
【问题描述】:

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

我在 ubuntu 18.04.5 上使用节点 v15.0.1 和 jest 26.6.0

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

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"
    }

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

【问题讨论】:

  • RenderBuffer 导入是否需要在任何地方使用?
  • 即使你不使用它,Jest 也会使用。它配置错误。请提供配置。
  • @EstusFlask 我已经添加了我的 package.json 配置。我错了什么配置?
  • 很可能,--experimental-vm-modules。 Jest 中对 ESM 的支持是实验性的。预计会缺少和错误。这包括模块模拟。不要将其用于实际工作。

标签: javascript jestjs es6-modules


【解决方案1】:

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

{
  transform: {}
}

在您的 Jest 配置文件中。默认情况下,transform 选项配置为使用babel-jest。详情请参阅this Jest documentation section。另请注意,您应该明确导入jest

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

不幸的是,正如其他评论者已经提到的那样,运行您的测试仍然会出现一些问题。或许,应该follow this issue 继续跟踪 Jest 中为支持 ESM 所做的更改。

例如,我当时很不幸地模拟了静态模块导入(版本 26.6.2):

开玩笑。(do|un)mock

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

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

【讨论】:

  • 另见 this issue 与 ESM 的 jest.mock 实施相关。
猜你喜欢
  • 2019-02-07
  • 2019-09-29
  • 2022-12-01
  • 2017-04-30
  • 2013-08-14
  • 2021-03-29
  • 2017-02-25
  • 2017-08-15
  • 1970-01-01
相关资源
最近更新 更多