Angular12升级至16后测试全失败:找不到@angular/core/testing模块
解决Angular 16升级后Jest测试找不到@angular/core/testing的问题
核心原因
Angular 16与你当前使用的Jest 27.x、旧版jest-preset-angular版本不兼容,导致预设文件无法正确解析Angular的测试模块。Angular 16要求使用适配的Jest生态依赖版本组合。
步骤1:安装兼容的依赖版本
先卸载现有冲突依赖,再安装适配Angular 16的版本:
# 卸载旧依赖 npm uninstall jest jest-environment-jsdom jest-preset-angular ts-jest # 安装兼容版本 npm install --save-dev jest@29.7.0 jest-environment-jsdom@29.7.0 jest-preset-angular@13.1.1 ts-jest@29.1.1
步骤2:更新jest.config.js配置
新版本的jest-preset-angular会自动处理大部分配置,简化你的配置文件如下:
const path = require('path'); module.exports = { preset: 'jest-preset-angular', setupFilesAfterEnv: ['<rootDir>/setup-jest.ts'], testEnvironment: 'jest-environment-jsdom', moduleNameMapper: { '^@app/(.*)$': '<rootDir>/src/app/$1', '^@environments/(.*)$': '<rootDir>/src/environments/$1', '^@src/(.*)$': '<rootDir>/src/$1', '^@assets/(.*)$': '<rootDir>/src/assets/$1', '^@styles/(.*)$': '<rootDir>/src/styles/$1', }, transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], globals: { 'ts-jest': { tsconfig: '<rootDir>/tsconfig.spec.json', stringifyContentPathRegex: '\\.html$', }, }, globalSetup: path.resolve(__dirname, 'jest-global-setup.js'), resolver: path.resolve(__dirname, 'src/jest.resolver.js'), };
注意:Jest 29中
testEnvironment需指定为jest-environment-jsdom(而非旧版的jsdom),同时移除了手动的transform配置,因为jest-preset-angular会自动注入正确的转换器。
步骤3:检查setup-jest.ts文件
确保你的setup-jest.ts顶部导入正确的初始化文件:
import 'jest-preset-angular/setup-jest';
如果之前有自定义的初始化逻辑,保留在该导入语句之后。
步骤4:验证tsconfig.spec.json配置
确保tsconfig.spec.json的compilerOptions满足以下要求:
{ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", "module": "CommonJS", "target": "ES2020", "types": ["jest", "node"] }, "include": ["src/**/*.spec.ts", "src/**/*.d.ts"] }
步骤5:清理缓存并重新运行测试
# 清除Jest缓存 npx jest --clearCache # 重新运行测试 npm test
内容的提问来源于stack exchange,提问作者Emmanuel Huff
相关产品推荐
相关产品推荐

