/** @type {import('jest').Config} */ const config = { preset: 'ts-jest', testEnvironment: 'node', // 测试文件匹配模式 testMatch: [ '**/__tests__/**/*.test.[jt]s?(x)', '**/?(*.)+(spec|test).[jt]s?(x)' ], // 模块名称映射 moduleNameMapping: { '^@/(.*)$': '/src/$1', '^@/client/(.*)$': '/src/client/$1', '^@/server/(.*)$': '/src/server/$1', '^@/shared/(.*)$': '/src/shared/$1', '^@/test/(.*)$': '/test/$1' }, // 覆盖率配置 collectCoverageFrom: [ 'src/**/*.{js,jsx,ts,tsx}', '!src/**/*.d.ts', '!src/client/api.ts', '!src/**/__tests__/**', '!src/**/__mocks__/**', '!src/**/index.ts', '!src/**/types.ts' ], coverageDirectory: 'coverage', coverageReporters: ['text', 'lcov', 'html'], coverageThreshold: { global: { branches: 70, functions: 70, lines: 70, statements: 70 } }, // 测试超时 testTimeout: 10000, // 测试环境设置 setupFilesAfterEnv: ['/src/test/setup.ts'], // 变换配置 transform: { '^.+\.[tj]sx?$': ['ts-jest', { tsconfig: 'tsconfig.json', useESM: true, }], }, // 模块文件扩展名 moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], // 测试路径忽略模式 testPathIgnorePatterns: [ '/node_modules/', '/dist/', '/build/', '/coverage/' ], // 监听模式配置 watchPathIgnorePatterns: [ '/node_modules/', '/dist/', '/build/', '/coverage/' ], // 测试运行器显示配置 verbose: true, notify: false, // CI环境配置 maxWorkers: process.env.CI ? 2 : '50%', // 全局变量 globals: { 'ts-jest': { isolatedModules: true } } }; // 前端测试环境特殊配置 if (process.env.TEST_ENV === 'ui') { config.testEnvironment = 'jsdom'; config.setupFilesAfterEnv = [ '/src/test/setup.ts', '@testing-library/jest-dom' ]; } export default config;