我试图在我的ES6 javascript项目中使用jest创建一个自动模拟。
我使用节点v15.0.1,并在ubuntu 18.04.5上使用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"
}对于这个问题的根源有什么想法吗?
发布于 2020-11-03 12:53:44
您必须禁用任何源代码转换,以便通过设置
{
transform: {}
}在Jest配置文件中。默认情况下,转换选项被配置为使用babel-jest。请参考这个Jest文档部分了解更多详细信息。还请注意,您应该显式导入jest:
import { jest } from '@jest/globals';不幸的是,它仍然有一些问题运行您的测试,正如其他评论者已经提到的。也许,为了支持ESM支持,应该使用跟进这个问题来跟踪Jest中所做的更改。
例如,我当时不太幸运地模拟静态模块导入(26.6.2版):
嘲笑(不要)嘲弄 由于ESM在评估模块时有不同的“阶段”,所以jest.mock将不适用于静态导入。不过,它可以用于动态导入,因此我认为我们只需在文档中清楚地了解它支持什么和不支持什么。 jest.mock调用是挂起的,但这对ESM没有帮助。我们可能会考虑将import 'thing‘转换为import('thing'),这应该允许提升工作,但是它是异步的。使用顶级的等待可能是这种方法的必要。我也认为这有足够的侵略性,可以单独选择。需要讨论的是-我们不需要支持jest.mock在初始版本中所能提供的所有内容。
https://stackoverflow.com/questions/64582674
复制相似问题