运行 jest 时打字稿路径无法解析?

Ole*_*Ole 5 typescript tsconfig jestjs ts-jest

尝试使用这些说明将此项目转换为玩笑。除了使用配置的文件外,我一切正常:paths

"paths": {
      "@fs/*": ["./src/*"], 
      "@test/*": ["./test/*"]
    }
Run Code Online (Sandbox Code Playgroud)

看起来好像在运行测试时导入语句没有解析并记录下来:

Cannot find module '@fs/container/validation/ValidationContext' from 'Core.spec.ts'

  1 | import { ValidationOptions } from "@fs/container/validation/ValidationOptions";
> 2 | import { ValidationContext } from "@fs/container/validation/ValidationContext";
    | ^
  3 | import { ValidationContainer } from "@fs/container/validation/ValidationContainer";
  4 | 
  5 | import { Core1 } from "@test/core/Core1";

  at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:221:17)
  at Object.<anonymous> (test/core/Core.spec.ts:2:1)
Run Code Online (Sandbox Code Playgroud)

有没有办法让 jest/ts-jest 包含@paths解析导入的同时?

Fra*_*his 33

在根项目文件夹中添加 jest.config.js ,内容如下。

const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig');
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
  modulePaths: ['<rootDir>'],
  coverageDirectory: '../coverage',
  moduleFileExtensions: ['js', 'json', 'ts'],
  testRegex: '.*\\.spec\\.ts$',
  transform: { '^.+\\.(t|j)s$': 'ts-jest' },
  collectCoverageFrom: ['**/*.(t|j)s'],
};
Run Code Online (Sandbox Code Playgroud)

还要确保您的tsconfig.json文件有一个paths字段,如下所示:

const { pathsToModuleNameMapper } = require('ts-jest');
const { compilerOptions } = require('./tsconfig');
module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
  modulePaths: ['<rootDir>'],
  coverageDirectory: '../coverage',
  moduleFileExtensions: ['js', 'json', 'ts'],
  testRegex: '.*\\.spec\\.ts$',
  transform: { '^.+\\.(t|j)s$': 'ts-jest' },
  collectCoverageFrom: ['**/*.(t|j)s'],
};
Run Code Online (Sandbox Code Playgroud)

  • `const { pathsToModuleNameMapper } = require('ts-jest')`。请参阅https://kulshekhar.github.io/ts-jest/docs/getting-started/paths-mapping/#jest-config-with-helper (2认同)
  • 我必须添加 `prefix` 参数才能使其正常工作:`pathsToModuleNameMapper(compilerOptions.paths, { prefix: "&lt;rootDir&gt;" })`。 (2认同)

小智 24

jest 无法遵循 tsconfig 的路径映射,因为它是 ts 编译器时间,因此 jest 配置应该具有相应的modulenamemapper来解析别名路径。


Édo*_*pez 8

我想解决模块路径开始~/我的<baseUrl>/<moduleName>

感谢OJ Kwon链接,我用(给他点)解决了这个问题。

配置文件

请参阅模块分辨率路径映射文档

{
  "compilerOptions": {
    "baseUrl": "src",
    "paths": {
      "~/*": ["*"]
    }
  },
}
Run Code Online (Sandbox Code Playgroud)

开玩笑的配置

然后我们也需要告诉jest解析路径。它是通过以下配置完成的:

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

  • 在我的例子中,它对我帮助很大,我的 ts 路径是 "@data/*": ["src/data/*"] 然后在我的玩笑配置中我添加了: '@data/(.*)': '&lt;rootDir&gt; /src/数据/$1', (10认同)