javascript - ES6 类的 jest.mock 产生 ReferenceError: require is not defined
问题描述
我正在尝试在我的 ES6 javascript 项目中使用 jest 创建一个自动模拟。
我在 ubuntu 上使用 nodev15.0.1
和 jest 。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"
}
关于这个问题的根本原因是什么的任何想法?
解决方案
您必须禁用任何源代码转换才能通过设置使其工作
{
transform: {}
}
在您的 Jest 配置文件中。默认情况下,转换选项配置为使用babel-jest
. 有关更多详细信息,请参阅此 Jest 文档部分。另请注意,您应该jest
显式导入:
import { jest } from '@jest/globals';
不幸的是,正如其他评论者已经提到的那样,它在运行您的测试时仍然可能存在一些问题。或许,人们应该关注这个问题,以继续跟踪 Jest 中为 ESM 支持所做的更改。
例如,我当时很不幸地模拟了静态模块导入(版本 26.6.2):
开玩笑。(不|不)嘲笑
由于 ESM 在评估模块时具有不同的“阶段”,因此 jest.mock 不适用于静态导入。它可以用于动态导入,所以我认为我们只需要在文档中明确它支持什么,不支持什么。
jest.mock 调用被提升,但这对 ESM 没有帮助。我们可能会考虑将 import 'thing' 转换为 import('thing') 这应该允许提升工作,但它是异步的。对于这种方法,使用顶级 await 可能是必要的。我还认为它的侵入性足以保证单独的选择。需要讨论的东西 - 我们不需要支持 jest.mock 可以为初始版本提供的所有内容。
推荐阅读
- python - 带有 ArcGIS 的 Flask 应用程序,Arcpy 不运行
- c# - MariaDB/MySQL 数据库上的 SQLDependency
- hyperledger - 超级账本作曲家@returns 不起作用
- android - Xamarin - PrintService 项目上的“java.lang.RuntimeException:无法实例化服务”
- sql-server - 如何识别所有具有(或没有)唯一索引的表?
- jquery - 如何使用节点刮刀单击页面中的“提交”按钮,然后检索它转到的页面
- javascript - 取消选中一类复选框
- php - PHP:有没有比 $_SERVER['DOCUMENT_ROOT'] 更容易的 docroot 参考?
- html - Angular - Primeng 的 confirmDialog 显示在 ng-bootstrap 的模态后面
- tfs - TFS 2018 更新 2 升级:报告服务