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

Set*_*ine 22 node.js npm reactjs 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)
Run Code Online (Sandbox Code Playgroud)

index.jsx

import AppContainer from 'src/views/app';
Run Code Online (Sandbox Code Playgroud)

的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"
    ]
  },
Run Code Online (Sandbox Code Playgroud)

运行仅包含树中相对路径的文件的测试运行正常.

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

twi*_*ls0 21

我认为您在寻找:根目录modulePathsmoduleDirectories

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

我将确保将其包含<rootDir>在roots数组,<rootDir>modulePaths数组和node_modulesmoduleDirectories数组中,除非您有充分的理由将它们排除在外。

"jest": {
  "roots": [
    "<rootDir>",
    "/home/some/path/"
  ],
  "modulePaths": [
    "<rootDir>",
    "/home/some/other/path"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
}
Run Code Online (Sandbox Code Playgroud)

  • `"modulePaths": ["&lt;rootDir&gt;/src/"]` 是我所需要的。 (11认同)

Hri*_*odi 17

既然package.json你有:

"moduleDirectories": [
    "node_modules",
    "src"
]
Run Code Online (Sandbox Code Playgroud)

这表示您导入的每个模块将node_modules首先进行查看,如果未找到,将查看src目录.

因为它正在调查src指南你应该使用:

import AppContainer from 'views/app';
Run Code Online (Sandbox Code Playgroud)

请注意,此路径对于src目录是绝对的,您不必导航以将其定位为相对路径.

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

  • 就我而言,考虑到我们有“@”指向某些特定的根目录,“moduleNameMapper”是正确的选择。 (2认同)

Ani*_*nna 8

那是因为 jest 无法识别相对导入,例如src/views/app

添加rootDirmodulePathspackage.json

"name": "my-app",
...
"jest": {
    ...
    "rootDir": "./",
    "modulePaths": [
      "<rootDir>"
    ],
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)


Wac*_*ock 7

添加

"moduleDirectories": [
    "node_modules",
    "src"
]
Run Code Online (Sandbox Code Playgroud)

如果你的 package.json 文件中有 Jest 的配置,应该可以工作。

如果你有一个jest.config.js文件,你应该在那里添加它,否则 package.json 将被这个配置文件覆盖(并忽略)。所以在你的jest.config.js文件中:

module.exports = {
// ... lots of props
  moduleDirectories: ["node_modules", "src"],
// ...
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*the 6

就我而言,我正在运行集成测试,并且所有测试都位于路径 src/int-test.spec.ts 的同一文件中,以便读取我必须编写的路径:

解决方案1

"jest": {
    ...,
    "moduleNameMapper": {
      "src/(.*)": "<rootDir>/$1"
    }
  }
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建 jest.config.js 文件,如果该文件名为 jest.config.js|ts|mjs|cjs|json,则会自动发现该文件。并将其放入其中:

解决方案2

const path = require('path');

module.exports = {
  moduleFileExtensions: ['js', 'json', 'ts'],
  roots: ['src'],
  testRegex: '.*\\.spec\\.ts$',
  transform: {
    '^.+\\.(t|j)s$': 'ts-jest',
  },
  collectCoverageFrom: ['**/*.(t|j)s'],
  coverageDirectory: '../coverage',
  testEnvironment: 'node',
  moduleDirectories: ['node_modules', 'src', __dirname],
};

Run Code Online (Sandbox Code Playgroud)


小智 5

确保您已运行npm inpm install更新 package.json 后。我的问题是:0