ts-jest(TypeScript Jest)中映射路径问题,找不到模块

Problem mapping path in ts-jest (TypeScript Jest), module cannot be found

我想在我的后端实施一些玩笑测试,所以我试图通过 jest.config.js 的 moduleNameMapper 映射我在 tsconfig.json 中配置的路径,但是当我运行 测试发现文件仍未导入,第 8 行显示此错误 ⬇


请帮助我正确映射我的路径,我将不胜感激任何帮助。
为了帮助你帮助我,这里有重要的文件。
jest.config.js(这里通常配置jest)⬇

/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  testMatch: ["**/***.test.ts"],
  verbose: true,
  forceExit: true,
  
  moduleNameMapper: {
    '@util/(.*)': '<rootDir>/src/util/'
  }
};

tsconfig.json(打字稿的普通配置文件)⬇

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "baseUrl": "src",
    "paths": {
      "@util/*": ["util/*"]
    },
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}

此问题是由于绝对导入引起的。如果仔细观察,您会发现您的导入语句是 util/logger。这种进口没有妥善解决。

如果您使用 VSCode,那么这是一种常见的情况,因为 VSCode 会尝试减少导入语句的长度。

要解决此问题,请使用相对导入。所以你的导入应该如下所示:

import logger from '../util/logger'

(注意:以上导入是相对于路径src/middleware/authenticateUser.ts,请根据您在哪个文件中使用导入更新导入)

我用以下内容创建了一个名为 .babelrc 的文件 ⬇ :

{
  "presets": ["@babel/preset-env"]
}

然后我配置了jest.config.js如下图⬇

/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
  transform: {
    '^.+\.ts$': 'ts-jest',
    '^.+\.js$': 'babel-jest',
    '^.+\.mjs$': 'babel-jest',
  },
  moduleDirectories: ['node_modules', '<rootDir>/src'],
  moduleNameMapper: {
    '@controllers/(.*)': '<rootDir>/src/controllers/',
    '@middleware/(.*)': '<rootDir>/src/middleware/',
    '@models/(.*)': '<rootDir>/src/models/',
    '@routes/(.*)': '<rootDir>/src/routes/',
    '@types/(.*)': '<rootDir>/src/types/',
    '@util/(.*)': '<rootDir>/src/util/',
  }
};

然后我配置了tsconfig.json如下图⬇:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "baseUrl": "src",
    "paths": {
      "@util/*": ["util/*"]
    },
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "types": ["jest"]
  }
}

感谢 Benjamin Drury 和@Ashok 的大力支持。