module.exports = { preset: 'ts-jest', testEnvironment: 'jsdom', roots: ['/src'], testMatch: ['**/__tests__/**/*.test.{ts,tsx}', '**/*.test.{ts,tsx}'], // 仅收集实际可单元测试的目录的覆盖率,排除 pages/API routes/admin 等需集成/E2E 测试的代码 collectCoverageFrom: [ 'src/components/ui/**/*.{ts,tsx}', 'src/components/layout/**/*.{ts,tsx}', 'src/components/seo/**/*.{ts,tsx}', 'src/components/detail/**/*.{ts,tsx}', 'src/components/sections/**/*.{ts,tsx}', 'src/components/content/**/*.{ts,tsx}', 'src/hooks/**/*.{ts,tsx}', 'src/lib/**/*.ts', '!src/**/*.d.ts', '!src/**/*.stories.{ts,tsx}', '!src/**/__tests__/**', ], // 覆盖率阈值采用渐进提升策略:基于 Phase 1-5 实测值设定目录级阈值,避免全局平均掩盖核心模块缺口 // 实测基准 (Phase 5): global(~33% stmts/~32% branches), hooks(~61%/~41%), lib(~45%/~43%), // ui(~15%/~21%), layout(~59%/~48%), detail(~32%/~29%), sections(~31%/~35%), content(~29%/~5%), // lib/cms(~67%/~83%), lib/constants(~94%/~81%) coverageThreshold: { global: { branches: 30, functions: 25, lines: 32, statements: 30, }, './src/hooks/': { branches: 38, functions: 60, lines: 60, statements: 60, }, './src/lib/': { branches: 40, functions: 45, lines: 42, statements: 42, }, './src/components/ui/': { branches: 18, functions: 10, lines: 15, statements: 14, }, './src/components/layout/': { branches: 45, functions: 35, lines: 60, statements: 55, }, './src/components/detail/': { branches: 25, functions: 22, lines: 30, statements: 30, }, './src/components/sections/': { branches: 30, functions: 18, lines: 30, statements: 30, }, './src/components/content/': { branches: 4, functions: 4, lines: 25, statements: 25, }, './src/components/seo/': { branches: 0, functions: 20, lines: 45, statements: 45, }, './src/lib/cms/': { branches: 80, functions: 75, lines: 60, statements: 65, }, './src/lib/constants/': { branches: 80, functions: 55, lines: 90, statements: 90, }, }, coverageReporters: ['text', 'lcov', 'html', 'json'], coverageDirectory: '/coverage', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], moduleNameMapper: { '^@/(.*)$': '/src/$1', }, transform: { // ts-jest 需要明确指定 jsx: 'react-jsx',因为项目 tsconfig 使用 'preserve' // 由后续 SWC/Babel 处理,但 Jest 环境下没有这些工具链 '^.+\\.(ts|tsx)$': ['ts-jest', { tsconfig: { jsx: 'react-jsx' } }], }, transformIgnorePatterns: [ 'node_modules/(?!(nanoid|next-auth|@auth)/)', ], setupFilesAfterEnv: ['/jest.setup.js'], testTimeout: 10000, verbose: true, maxWorkers: '50%', };