【问题标题】:TypeError: (0 , _style.default) is not a function - jest + material-uiTypeError: (0 , _style.default) 不是函数 - jest + material-ui
【发布时间】:2021-12-26 13:45:30
【问题描述】:

我有如下设置:

// .jestrc.json

...
"moduleNameMapper": {
  "style$": "<rootDir>/tests/mock.ts"
}

// mock.ts

export default {}

这就是我通常将我的资产从开玩笑中排除的方式,这样它就不会在尝试解析它时中断。

但是我不得不使用@mui/material(不是我的选择),并且当使用与我通常运行测试相同的设置时,现在任何@mui 导入都会中断。在我导入 @mui 组件的任何地方,我的测试都会因错误 TypeError: (0 , _style.default) is not a function 而中断。

我已经检查了我能找到的关于此错误的所有 stackoverflow 问题以及其他几篇帖子,但我没有尝试修复它。

【问题讨论】:

    标签: javascript jestjs material-ui


    【解决方案1】:

    发生错误是因为moduleNameMapper 中的正则表达式也捕获了所有@mui 样式,这使得@mui 因无法访问其内部使用的主题提供程序和HOC 样式而中断。它导致@mui 现在也使用空的模拟对象并因此而中断。

    我找到并尝试了几个使用 jest.mock 的解决方案并模拟了样式/主题,但是其中大多数都是完全古怪的解决方案,而且都没有奏效。

    最终我修复它的方式是改变:

    "moduleNameMapper": {
      "style$": "<rootDir>/tests/mock.ts"
    }
    

    到:

    "moduleNameMapper": {
      "style.(scss)$": "<rootDir>/tests/mock.ts"
    }
    

    所以它只会排除我自己的样式,而不是@mui@mui 将在使用 jest 时毫无问题地处理自己的样式,在使用 moduleNameMapper 时,您必须注意不要模拟依赖项所需的模块,并且只排除您需要的模块。

    在正则表达式中使用“样式”意外地还排除了所有 @mui 的东西而没有意识到,只是修复它并允许 @mui 自行处理使一切工作完美。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2020-03-03
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多