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"
],