解析 jest.mock 中的 TypeScript 路径

Pau*_* S. 1 unit-testing typescript jestjs ts-jest

我正在向使用 的 TypeScript 项目添加单元测试compilerOptions.paths,并且我需要模拟导入。

\n

我遇到了一个问题,jest 无法解析要模拟的模块

\n
 FAIL  logic/index.test.ts\n  \xe2\x97\x8f Test suite failed to run\n\n    Cannot find module \'@lib/foo\' from \'logic/index.test.ts\'\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用ts-jest它添加对导入中路径的支持,但看起来我需要为模拟执行额外的步骤

\n

解决这里路径的正确方法是什么?

\n
\n

简化案例

\n
{\n  "baseUrl": ".",\n  "compilerOptions": {\n    "paths": {\n      "@lib/*": ["lib/*"]\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

文件系统

\n
* lib\n  * __mocks__\n    * foo.ts\n  * foo.ts\n* logic\n  * index.ts\n  * index.test.ts\n* tsconfig.json\n* jest.config.js\n
Run Code Online (Sandbox Code Playgroud)\n
// index.ts\nimport foo from \'@lib/foo\';\n\nconst logic = () => foo();\n\nexport default logic;\n
Run Code Online (Sandbox Code Playgroud)\n
// index.test.ts\nimport \'jest\';\n\nimport logic from \'.\';\n\njest.mock(\'@lib/foo\');\n
Run Code Online (Sandbox Code Playgroud)\n
* lib\n  * __mocks__\n    * foo.ts\n  * foo.ts\n* logic\n  * index.ts\n  * index.test.ts\n* tsconfig.json\n* jest.config.js\n
Run Code Online (Sandbox Code Playgroud)\n

jon*_*rpe 5

根据文档ts-jest,当您使用时,compilerOptions.paths需要相应地更新 Jest moduleNameMapper。该库提供了一个实用程序来为您构建适当的映射:

// jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest/utils');

const { compilerOptions } = require('path/to/tsconfig');

module.exports = {
  moduleNameMapper: pathsToModuleNameMapper(
    compilerOptions.paths,
    { prefix: '<rootDir>/' },
  ),
  preset: 'ts-jest',
  testEnvironment: 'node',
};
Run Code Online (Sandbox Code Playgroud)

或者,根据您的情况,您可以手动执行此操作:

// jest.config.js
module.exports = {
  moduleNameMapper: { '^@lib/(.*)$': '<rootDir>/lib/$1' },
  preset: 'ts-jest',
  testEnvironment: 'node',
};
Run Code Online (Sandbox Code Playgroud)