Angular Jest测试报错:TypeError: 无法读取undefined的toLowerCase属性
问题场景
我正在用Jest为Angular应用编写测试,已完成以下配置:
- 在
angular.json中配置了@angular-builders/jest:run构建器及对应选项; jest.config.json里设置了setupFilesAfterEnv、transform等配置项;jest.setup.js中注册了enlocale数据,并添加了TextEncoder/TextDecoder全局对象。
测试用例仅验证ConfigurationService实例是否创建,但执行ng test时报错,栈信息指向@angular/core的registerLocaleData方法中调用toLowerCase时触发TypeError: Cannot read properties of undefined (reading 'toLowerCase')。我在报错位置加了console.log,显示LocaleId为'en'且类型是string,但仍无法定位问题根源。
可能原因
该错误并非LocaleId本身的问题,而是registerLocaleData接收的locale数据对象不完整,或是Jest环境下Angular locale数据加载存在异常。即使LocaleId是合法字符串,若传入的locale数据内部属性缺失(比如未正确初始化的语言规则对象),就会导致内部逻辑调用toLowerCase时访问到undefined。
解决方案
1. 确认locale数据导入的正确性
确保在jest.setup.js中导入完整的locale数据对象,而非仅导入标识字符串:
// 正确写法 import localeEn from '@angular/common/locales/en'; import { registerLocaleData } from '@angular/core'; registerLocaleData(localeEn, 'en');
避免仅传入字符串标识,必须将完整的locale数据对象作为第一个参数传入registerLocaleData。
2. 检查Jest的transform配置
确保jest.config.json中对@angular/common/locales下的文件配置了正确的转换器,防止locale数据被错误转译:
{ "transform": { "^.+\\.(ts|js)$": "ts-jest", "^.+\\.mjs$": "ts-jest" } }
部分Angular版本的locale文件为.mjs格式,需确保ts-jest能正确处理这类模块。
3. 对齐依赖版本兼容性
若@angular-builders/jest、jest或Angular核心包版本不匹配,可能引发此类环境异常:
- 确保
@angular-builders/jest版本与Angular主版本一致; - 确保
jest和ts-jest版本适配当前Angular使用的TypeScript版本。
4. 调整全局对象的添加时机
确保TextEncoder/TextDecoder的全局注册在locale数据注册之前执行,避免环境依赖未准备完成:
// jest.setup.js // 先添加全局对象 global.TextEncoder = require('util').TextEncoder; global.TextDecoder = require('util').TextDecoder; // 再注册locale数据 import localeEn from '@angular/common/locales/en'; import { registerLocaleData } from '@angular/core'; registerLocaleData(localeEn, 'en');
内容的提问来源于stack exchange,提问作者Sai Krushna Rath

