Jest:moduleNameMapper:mocks不适用于使用“moduleNameMapper”的映射模块的导入模块

时间:2017-08-13 07:02:45

标签: reactjs webpack git-submodules jest jest-webpack-alias

我在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

的jest配置的一部分
"moduleNameMapper": {
  "^api(.*)$": "<rootDir>/some-lib/src$1"
},

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"));

它将被转换为正确的路径