/** * Jest 配置 * * 仅对消息状态核心逻辑(store 幂等性 / 实时事件管道 / 未读计数原子性)做单测, * 不覆盖 RN / Expo UI。所有平台依赖(@/services/core、@/database、@/core/events、 * @/stores/auth、@/services/message)在测试中通过 moduleNameMapper 映射到 mock。 */ const { pathsToModuleNameMapper } = require('ts-jest'); const tsconfig = require('./tsconfig.json'); const tsconfigBase = require('expo/tsconfig.base.json'); // 合并 base + 项目 paths const paths = { ...(tsconfigBase.compilerOptions.paths || {}), ...(tsconfig.compilerOptions.paths || {}), }; module.exports = { preset: 'ts-jest', testEnvironment: 'node', roots: ['/src'], testMatch: ['**/__tests__/**/*.test.ts'], moduleNameMapper: { // 平台依赖统一映射到 mock(必须放在 @/* 通配之前,否则会被通配吞掉) '^@/services/core$': '/src/stores/message/__tests__/mocks/coreMock.ts', '^@/services/message$': '/src/stores/message/__tests__/mocks/messageServiceMock.ts', '^@/database$': '/src/stores/message/__tests__/mocks/databaseMock.ts', '^@/core/events/EventBus$': '/src/stores/message/__tests__/mocks/eventBusMock.ts', '^@/stores/auth/authStore$': '/src/stores/message/__tests__/mocks/authStoreMock.ts', '^@react-native-async-storage/async-storage$': '/src/stores/message/__tests__/mocks/asyncStorageMock.ts', // @/* 路径别名 → 真实 src(通配兜底,放最后) ...pathsToModuleNameMapper(paths, { prefix: '/' }), }, transform: { '^.+\\.tsx?$': [ 'ts-jest', { tsconfig: '/src/stores/message/__tests__/tsconfig.json', isolatedModules: true, }, ], }, clearMocks: true, };