【问题标题】:Jest:moduleNameMapper: mocks do not work for imported modules of mapped modules using "moduleNameMapper"开玩笑:moduleNameMapper:模拟不适用于使用“moduleNameMapper”的映射模块的导入模块
【发布时间】:2017-08-13 07:02:45
【问题描述】:

我在 webpack 中使用 jest。 Webpack 配置为对某些导入使用别名:

alias: {
  shared: path.resolve(process.cwd(), "some-lib/src"),
},
modules: ["app", "node_modules", "some-lib"],

some-lib 是添加到项目中的 git 子模块。 当我试图开玩笑地模拟导入的模块时它不起作用

jest.mock("shared/utils")
import { utilFunc } from "shared/utils"

因此utilFunc 未被模拟。 各位大侠,有没有大神可以推荐一下解决方法?

UPD:来自package.json的开玩笑配置的一部分

"moduleNameMapper": {
  "^api(.*)$": "<rootDir>/some-lib/src$1"
},

【问题讨论】:

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


    【解决方案1】:

    https://webpack.js.org/configuration/resolve/#resolve-alias

    创建别名以更轻松地导入或需要某些模块。比如给一堆常用的src/文件夹起别名。

    换句话说,别名仅适用于导入或需要,不适用于开玩笑的功能。 webpack 所做的实际上是在编译时更改路径,因此当您的应用程序编译时,文件实际更改为。

    jest.mock("shared/utils")
    import { utilFunc } from "your_current_working_dir/some-lib/src/utils"
    

    如您所见, jest 保持不变,因此路径可能不存在,因此 jest 无法模拟它。我建议使用 webpack 定义插件来创建一个名为 ABSOLUTE_SHARED_PATH 之类的全局变量。将其添加到您的 .eslint 全局变量中,然后将其用于开玩笑,以便路径匹配。

    new webpack.DefinePlugin({
      ABSOLUTE_SHARED_PATH: JSON.stringify(path.resolve(process.cwd(), "some-lib/src")
    })
    

    JSON.stringify 是使其成为字符串所必需的。 Webpack 使用定义插件进行了完美的一对一替换。这会将您的项目封装为双引号字符串。尝试在控制台中 JSON.stringify 字符串以获取更多信息。如果你不这样做,webpack 会抛出一个错误。

    现在,当您更改代码中的玩笑时

    jest.mock(path.resolve(ABSOLUTE_SHARED_PATH, "shared/utils"));
    

    它将被转换为正确的路径

    【讨论】:

    • 谢谢你,thomas 这很有意义。据我了解,jest 有类似于 webpack 别名 facebook.github.io/jest/docs/… 的东西,我刚刚更新了我的问题以包含此选项的 jest 配置,显然,它似乎对我不起作用
    猜你喜欢
    • 2018-09-14
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2020-09-17
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多