我有一个打字稿项目,我在 ts.config.json 中设置了别名
{
"compilerOptions": {
"paths": {
"@pkg/*": ["./packages/*"],
},
}
}
在我的 ts 文件中,我可以缩短导入路径
// example.ts
import {someThing} from '@pkg/mypackage'
它与
tsc
配合得很好,vscode 可以正确识别别名路径。
但是当我运行
npm t
运行 jest
时它失败了
Cannot find module '@pkg/mypackage' from 'example.ts'
jest.config.js
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
transform: {
"^.+\\.tsx?$": "ts-jest",
},
};
我将其添加到我的 package.json 文件中
"jest": {
"moduleNameMapper": {
"@pkg/(.*)": "<rootDir>/packages/$1"
}
}
我设法使用
pathsToModuleNameMapper
,但我遇到了这个问题
https://github.com/kulshekhar/ts-jest/issues/2709
我遇到了同样的问题,但设法通过使用几个插件使其正常工作。最后我还有一些额外的匹配器用于一些额外的测试类型。
我的 Jest-base.config.js 已安装并运行 tsconfig-paths-jest 插件。这个插件解决了我的 tsconfig 路径问题。
我使用一个通用的基本文件来进行单元测试和端到端测试之间的通用配置,这两个测试目前都是通过 Jest 运行的。
jest-base.config.ts
const tsconfig = require('./tsconfig.json');
const moduleNameMapper = require('tsconfig-paths-jest')(tsconfig);
module.exports = {
moduleNameMapper,
preset: 'ts-jest',
testEnvironment: 'node',
rootDir: './',
collectCoverage: true,
collectCoverageFrom: [
'<rootDir>/**/*.ts',
'!<rootDir>/**/*.interface.ts',
'!<rootDir>/**/*.mock.ts',
'!<rootDir>/**/*.module.ts',
'!<rootDir>/**/__mock__/*',
'!<rootDir>/src/main.ts'
],
coverageProvider: 'v8',
coverageReporters: [
'clover',
'json',
'lcov',
'text',
'text-summary'
],
resetModules: true,
setupFiles: [
'dotenv/config'
],
// Add the community jest-extended matchers
setupFilesAfterEnv: [
'jest-extended'
],
verbose: false
};
我的 jest.config.js (用于单元测试)将扩展我的 jest-base.config.js 以添加单元测试特定代码,例如覆盖率要求、覆盖率输出的存储位置等。
jest.config.js
const JestBaseConfiguration = require('./jest-base.config');
module.exports = Object.assign(JestBaseConfiguration, {
moduleFileExtensions: ['js', 'json', 'ts'],
testRegex: '.e2e-spec.ts$',
transform: {
'^.+\\.(t|j)s$': 'ts-jest'
},
...
我通过向 jest.config.ts 文件添加
moduleNameMapper
属性解决了这个问题。
ts.config.json:
"paths": {
"@/*": ["src/*"],
"@": ["src/index.ts"]
},
jest.config.json:
import type { Config } from "jest";
const config: Config = {
preset: "ts-jest",
testEnvironment: "node",
moduleNameMapper: {
"@/(.*)": "<rootDir>/src/$1",
},
};
export default config;