You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Jest测试报错:TypeError: 无法读取undefined的toLowerCase属性

Angular Jest测试中registerLocaleData触发toLowerCase未定义错误的排查与解决

问题场景

我正在用Jest为Angular应用编写测试,已完成以下配置:

  • 在angular.json中配置了@angular-builders/jest:run构建器及对应选项;
  • jest.config.json里设置了setupFilesAfterEnv、transform等配置项;
  • jest.setup.js中注册了en locale数据,并添加了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:39:54