node.js - 添加 setupFilesAfterEnv 后,模拟函数在 .test 文件中不起作用
问题描述
在 jest.config.js 中添加setupFilesAfterEnv之后:
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
setupFilesAfterEnv: ["./test/setupAfterEnv.ts"]
}
模拟函数在文件中不再起作用,.test.ts
但在 setupFilesAfterEnv 中写入的文件中起作用./test/setupAfterEnv.ts
模拟函数示例(.test.ts
文件和setupAfterEnv.ts
在同一个director中):
jest.mock("../src/service/sendEmail.ts", () => ({
send: () => {
return "MOCK sendEmail sent"
}
}));
我没有收到任何错误,并且应该模拟的其他功能运行。当我在模拟函数中写错路径时,我得到了错误
can't find module
。所以它看起来找到了应该模拟但不运行模拟函数并运行另一个函数的函数如果我在其中评论了setupFilesAfterEnv配置,
jest.config.js
它会再次起作用。
解决方案
文档状态
警告:在安装文件中导入模块 (由 setupTestFrameworkScriptFile 指定) 将防止对有问题的模块进行模拟, 以及它导入的所有模块。
如果您的 ./test/setupAfterEnv.ts 中有任何导入/要求,它们可能会导入其他文件,并且在该过程中导入的任何链都将无法模拟('../somemodule'); 在测试中。
我不确定为什么会有这个限制;如果您在 setupAfterEnv.ts 文件本身中调用 mock('../somemodule'),它将在稍后在您的测试中被模拟。但我认为这很糟糕,因为只有一些测试可能想要模拟某些模块,而其他测试则希望它们不会被模拟。可惜。就我而言,我想导入一个 typeorm 库并连接到数据库。但是创建这个连接的类导入了我们所有的实体,所有的实体类都导入了其他类,这些类导入了其他类等等……所以没有什么是可模拟的。由于这个限制,根本无法使用。
推荐阅读
- python-3.x - 多个光标与多个连接
- android - 带有proguard的Android应用程序在发布时崩溃
- mysql - rownum 和对齐顺序不能按预期工作
- android - Android - 泛型类型作为 ObservableTransformer 中的表达式
- php - 回显不同,每个图像中的一行取数据库中的最后 2 行
- bootstrap-4 - 如何在移动视图而不是桌面中换行?
- mysql - 在mysql中获取从过去一年到上个月最后一天的记录
- reactjs - React Native Redux AsyncStorage 返回 Null
- php - PHP encrpyt,用python解密后的前16个字符串
- python - 如何修复 Mac OS 上的 mysql django 连接?我已经安装了 mysqlclient 但是“你安装了 mysqlclient 吗?” 显示错误