我正在尝试在我的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"
}
关于此问题的根本原因有什么想法?
答案 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的所有支持。