当导入具有绝对路径的组件时,Jest给出“找不到模块”

时间:2018-06-14 17:55:27

标签: node.js reactjs npm jestjs

运行Jest时收到以下错误

Cannot find module 'src/views/app' from 'index.jsx'

  at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:179:17)
  at Object.<anonymous> (src/index.jsx:4:12)

index.jsx

import AppContainer from 'src/views/app';

的package.json

  "jest": {
    "collectCoverageFrom": [
      "src/**/*.{js,jsx,mjs}"
    ],
    "setupFiles": [
      "<rootDir>/config/polyfills.js"
    ],
    "testMatch": [
      "<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
      "<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"
    ],
    "testEnvironment": "node",
    "testURL": "http://localhost",
    "transform": {
      "^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
      "^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
    },
    "transformIgnorePatterns": [
      "[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
    ],
    "moduleDirectories": [
        "node_modules",
        "src"
    ],
    "moduleNameMapper": {
      "^react-native$": "react-native-web"
    },
    "moduleFileExtensions": [
      "web.js",
      "js",
      "json",
      "web.jsx",
      "jsx",
      "node",
      "mjs"
    ]
  },

运行只包含树中相对路径的文件的测试运行正确。

要澄清,我正在寻找如何配置Jest以使绝对路径不失败。

6 个答案:

答案 0 :(得分:10)

我认为您正在寻找:rootsmodulePathsmoduleDirectories

您可以添加相对路径和绝对路径。

我确保在根数组中包含<rootDir>,在modulePaths数组中包含node_modules,在moduleDirectories数组中包含"jest": { "roots": [ "<rootDir>", "/home/some/path/" ], "modulePaths": [ "<rootDir>", "/home/some/other/path" ], “moduleDirectories”: [ “node_modules”, ], } ,除非您有充分的理由排除它们。

{ 
                "test":"rest",
                "check" :{ 
                           "id":1,
                           "name": "xyz"
                         }
             }

答案 1 :(得分:9)

因为你在package.json

"moduleDirectories": [
    "node_modules",
    "src"
]

其中表示您导入的每个模块将首先查看node_modules,如果未找到,将会查看src目录。

因为它正在研究src diretory,你应该使用:

import AppContainer from 'views/app';

请注意,此路径是src目录的绝对路径,您无需导航即可将其定位为相对路径。

或者您可以在pakcage.json中的moduleDirectories中配置根目录,以便可以根据需要导入所有组件。

答案 2 :(得分:0)

当我为旧版(2.5.x)vue项目添加“笑话”支持时,我也遇到了这个问题。

我搜索了一下,发现升级到babel-7应该可以解决此问题。但最后,我重新创建了最新版本的vue项目。现在可以了

答案 3 :(得分:0)

添加

"moduleDirectories": [
    "node_modules",
    "src"
]

如果package.json文件中包含Jest的配置,则应该工作。

如果有一个jest.config.js文件,则应将其添加到该文件中,否则package.json将被此配置文件覆盖(并忽略)。因此,在您的jest.config.js文件中:

module.exports = {
// ... lots of props
  moduleDirectories: ["node_modules", "src"],
// ...
}

答案 4 :(得分:0)

添加 __esModule:true 为我解决了这个问题。

jest.mock('module',()=>({
  __esModule: true,                    // this makes it work
  default: jest.fn()
}));

希望这对某人有所帮助。虽然这不是很具体的问题。

答案 5 :(得分:0)

对于那些使用 Webpack 和 Babbel 从头开始​​构建东西的人。 请尝试以下步骤:

  1. 删除 node_modules 文件夹并重新安装。 (这解决了我的问题)。

  2. 这里有一个链接,其中包含设置 Webpack 的必要文档,在某些情况下这不是必需的。 Jest Docs Webpack

  3. 这是一个文档链接,该链接解释了如何使用 React 设置 Jest(不使用 Create-React-App)。 Jest React Docs

4.这是一个使用 Jest 进行简单设置的示例。您可以在 package.json 或 Jest 配置文件中进行设置。

免责声明:这不能回答 OP 问题。但是大多数人最终会因为这个问题使用的关键字而来到这里。

  "jest": {
"moduleFileExtensions": ["js", "jsx"],
"moduleDirectories": ["node_modules"],
"moduleNameMapper": {
  "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
  "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
}

},