網站搜尋

reactjs - Jest 測試因缺少元資料而失敗


有單元測試因特定錯誤訊息而失敗。

 Test suite failed to run

    Failed to get mock metadata: <path-to-project>/node_modules/lodash/_freeGlobal.js

    See: https://jestjs.io/docs/manual-mocks.html#content

問題的來源似乎是在應用程式代碼中使用了 lodash/isEmpty。最終這個依賴縮小到導出 global 對象的 _freeGlobal.js。jest(使用 jest-mocks 庫)無法獲取此對象的元數據,因為它無法識別該類型。

問題:有沒有方法可以讓我模擬全局對象,或者讓 Jest 正確模擬 lodash 返回的 global?

我完全知道問題發生在哪裡。

  • Jest 會遍歷我 TypeScript 文件中的每個匯入
  • 確定每個模組直到最後一個層級,
  • 透過 jest-mock 嘲笑它們
  • 在這裡,jest-mock 嘗試獲取 getMetadata
  • 作為元資料的一部分,它試圖在這裡獲取類型名稱
  • 由於 Object.prototype.toString.call(global) 會輸出 [object Window],因此無法檢測類型名稱 window,此時會出現錯誤。

環境

"jest": "24.9.0",
"jest-cli": "24.9.0",
"jest-dom": "4.0.0",
"ts-jest": "24.2.0",
"@types/jest": "24.0.25",
"babel-jest": "24.9.0",

Jest 配置:

"jest": {
  "automock": true,
  "preset": "ts-jest/presets/js-with-babel",
  "testEnvironment": "jsdom",
  "roots": [
    "./app/cdap/"
  ],
  "modulePaths": [
    "./app/cdap/"
  ],
  "modulePathIgnorePatterns": [
    "./app/cdap/components/AbstractWidget/SchemaEditor/Context/__tests__/schemas.js",
    "./app/cdap/components/AbstractWidget/SchemaEditor/Context/__tests__/data"
  ],
  "unmockedModulePathPatterns": [
    "<rootDir>/node_modules/lodash/isEmpty",
    "<rootDir>/node_modules/lodash/round",
    "<rootDir>/node_modules/lodash/cloneDeep",
    "<rootDir>/node_modules/react",
    "<rootDir>/node_modules/react-dom"
  ],
  "moduleNameMapper": {
    "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
    ".scss$": "<rootDir>/__mocks__/styleMocks.js",
    "/^components/": "<rootDir>/app/cdap/components",
    "/^services/": "<rootDir>/app/cdap/services",
    "/^api/": "<rootDir>/app/cdap/api",
    "^lib": "<rootDir>/../lib",
    "^mocks": "<rootDir>/__mocks__"
  },
  "globals": {
    "ts-jest": {
      "babelConfig": {
        "plugins": [
          "@babel/plugin-transform-modules-commonjs"
        ]
      }
    }
  }
}

注意: 已經嘗試過其他討論串的建議。隨著我不斷將特定的 lodash 模組加入到 unmockedModulePatterns 中,最終我自己的模組被模擬了,導致我所有的測試都失敗。

"unmockedModulePathPatterns": [
   "<rootDir>/node_modules/lodash/isEmpty",
   "<rootDir>/node_modules/lodash/round",
   "<rootDir>/node_modules/lodash/cloneDeep",
   "<rootDir>/node_modules/react",
   "<rootDir>/node_modules/react-dom"
],