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

为何$localize `:@@ID:`在Angular标准单元测试配置中失效?

解决Angular单元测试中$localize返回空字符串的问题

核心原因

Angular测试套件默认不会自动加载本地化资源文件,也不会初始化$localize的翻译注册表,导致测试时无法解析@@Some这类key对应的翻译文本,直接返回空字符串。

无需Mock的解决方案

1. 在测试文件中手动注册翻译

如果你的翻译存储在JSON文件中,可直接导入并注册到$localize:

import { $localize } from '@angular/localize';
// 替换为你的翻译文件实际路径
import translations from './assets/i18n/messages.en.json';

// 注册翻译映射
$localize.load(translations);

2. 测试模块中配置本地化依赖

在TestBed配置里添加本地化相关提供者,确保测试环境初始化翻译能力:

import { TestBed } from '@angular/core/testing';
import { provideLocalization } from '@angular/localize';
import { LOCALE_ID } from '@angular/core';
import { YourService } from './your.service';

describe('YourService', () => {
  let service: YourService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        YourService,
        { provide: LOCALE_ID, useValue: 'en-US' },
        provideLocalization({
          // 直接传入翻译对象或加载文件
          translations: require('./assets/i18n/messages.en.json')
        })
      ]
    });
    service = TestBed.inject(YourService);
  });

  it('should return correct localized text', () => {
    const result = service.getInfo('param');
    expect(result).toBe('预期的本地化文本内容');
  });
});

3. 全局配置测试环境本地化

若多个测试文件都需要用到本地化,可在test.ts(测试入口文件)中全局注册翻译,避免重复配置:

// test.ts
import { $localize } from '@angular/localize';
import translations from './src/assets/i18n/messages.en.json';

// 全局加载翻译
$localize.load(translations);

// 保留原有测试初始化代码
import 'zone.js/testing';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

declare const require: {
  context(path: string, deep?: boolean, filter?: RegExp): {
    keys(): string[];
    <T>(id: string): T;
  };
};

getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting(),
);

const context = require.context('./', true, /\.spec\.ts$/);
context.keys().map(context);

注意事项

  • 确保翻译文件格式符合$localize要求,JSON文件结构应为:{ "locale": "en-US", "translations": { "@@Some": "对应翻译文本" } }
  • 若使用XLIFF格式翻译文件,需借助@angular/localize/tools工具转换为可直接加载的格式

内容的提问来源于stack exchange,提问作者carterv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:35:23