我在webpack中使用jest。 Webpack配置为对某些导入使用别名:
alias: {
shared: path.resolve(process.cwd(), "some-lib/src"),
},
modules: ["app", "node_modules", "some-lib"],
some-lib
是添加到项目中的git子模块。
当我试图在jest中模拟导入的模块时它不起作用
jest.mock("shared/utils")
import { utilFunc } from "shared/utils"
结果utilFunc
未被取消。
伙计们,有人可以建议请问如何解决它?
UPD:来自package.json
"moduleNameMapper": {
"^api(.*)$": "<rootDir>/some-lib/src$1"
},
答案 0 :(得分:1)
https://webpack.js.org/configuration/resolve/#resolve-alias
创建别名以便更轻松地导入或需要某些模块。例如,为一堆常用的src /文件夹添加别名。
换句话说,别名仅适用于导入或需要,而不是jest功能。 webpack所做的实际上是在编译时改变了路径,所以当你的应用程序编译文件实际改变的内容时。
jest.mock("shared/utils")
import { utilFunc } from "your_current_working_dir/some-lib/src/utils"
正如你所看到的,jest保持不变,因此路径可能不存在,因此jest无法模拟它。我建议使用webpack define插件创建一个名为ABSOLUTE_SHARED_PATH的全局变量。将它添加到.eslint全局变量中,然后将其用于jest,以便路径匹配。
new webpack.DefinePlugin({
ABSOLUTE_SHARED_PATH: JSON.stringify(path.resolve(process.cwd(), "some-lib/src")
})
JSON.stringify是使其成为字符串所必需的。 Webpack使用define插件进行了完美的1对1替换。这会将您的项目封装为双引号字符串。尝试在控制台中使用JSON.stringify字符串以获取更多信息。如果你不这样做,webpack会抛出一个错误。
现在,当您更改代码中的笑话时
jest.mock(path.resolve(ABSOLUTE_SHARED_PATH, "shared/utils"));
它将被转换为正确的路径