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

使用nestjs-i18n单元测试报错:Cannot read properties of undefined (reading 'lang')

解决Jest测试中I18nContext.current()返回undefined的问题

问题核心是单元测试环境未初始化I18nContext上下文,导致I18nContext.current()返回undefined,访问lang属性时抛出错误。以下是两种可行的解决方式:

方式一:直接Mock I18nContext静态类

在测试文件顶部用Jest mock I18nContext的current方法,让它返回带有指定语言属性的对象:

// 替换为你项目中实际的I18n包路径,比如@nestjs/i18n
jest.mock('@nestjs/i18n', () => ({
  ...jest.requireActual('@nestjs/i18n'), // 保留其他未mock的原有功能
  I18nContext: {
    current: jest.fn().mockReturnValue({ lang: 'fr' }),
  },
}));

describe('Testing getErrorMessage()', () => {
  let service: MessageService;
  let mockI18nService: Partial<I18nService>;

  beforeEach(async () => {
    mockI18nService = {
      translate: jest.fn().mockReturnValue('mock translated message'),
    };

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        MessageService,
        { provide: I18nService, useValue: mockI18nService },
      ],
    }).compile();

    service = module.get<MessageService>(MessageService);
  });

  it('should return exceptions.AMBIGUOUS with status code 300', () => {
    const spyService = jest.spyOn(mockI18nService, 'translate');
    service.getErrorMessage(300);
    
    expect(spyService).toHaveBeenCalledWith('exceptions.AMBIGUOUS', {
      lang: 'fr',
    });
  });
});

如果需要在不同测试用例中切换语言,可通过mockReturnValueOnce动态修改:

it('should use English for status code 404', () => {
  jest.spyOn(I18nContext, 'current').mockReturnValueOnce({ lang: 'en' });
  service.getErrorMessage(404);
  
  expect(spyService).toHaveBeenCalledWith('exceptions.NOT_FOUND', {
    lang: 'en',
  });
});

方式二:配置I18nModule测试版本(贴近真实环境场景)

若测试需要更贴近真实环境的I18n上下文,可在TestingModule中配置I18nModule的测试版本并指定默认语言:

beforeEach(async () => {
  const module: TestingModule = await Test.createTestingModule({
    imports: [
      I18nModule.forRoot({
        fallbackLanguage: 'fr',
        loader: I18nJsonLoader,
        paths: [path.join(__dirname, '/i18n')], // 指向你的测试翻译文件路径
      }),
    ],
    providers: [MessageService],
  }).compile();

  service = module.get<MessageService>(MessageService);
});

这种方式会初始化真实的I18nContext,无需手动mock静态方法,但需确保测试翻译文件存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:56:24