使用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
相关产品推荐
相关产品推荐

