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

Angular项目Jest测试TranslatePipe报错:无法读取subscribe属性

解决Angular Jest测试中TranslatePipe的subscribe错误

问题根源

TranslatePipe执行transform方法时会订阅TranslateService的onLangChange Observable,你的mock中onLangChange直接用of()创建的冷Observable,在组件初始化订阅时可能已完成,导致内部触发Cannot read properties of undefined (reading 'subscribe')错误;同时导入真实的TranslateModule.forRoot()会覆盖你提供的mock服务,导致mock失效。

修正方案

1. 修正TranslateService的onLangChange模拟

将onLangChange改为BehaviorSubject(确保订阅时能获取初始值,符合真实TranslateService的行为):

import { BehaviorSubject, of } from 'rxjs';

export const translateServiceMock = {
  addLangs: jest.fn(),
  setDefaultLang: jest.fn(),
  use: jest.fn().mockReturnValue(of('da')),
  getLangs: jest.fn().mockReturnValue(['da', 'en']),
  get: jest.fn().mockReturnValue(of('translated text')),
  instant: jest.fn((key: string) => key),
  // 改用BehaviorSubject提供持续可订阅的语言变更流
  onLangChange: new BehaviorSubject({ lang: 'en' }),
};

2. 移除测试模块中的TranslateModule.forRoot()

真实的TranslateModule.forRoot()会初始化真实的TranslateService,覆盖你的mock配置,测试模块中需删除该导入。

3. 正确处理TranslatePipe

组件模板中使用translate管道时,二选一配置:

  • 方案A:声明真实TranslatePipe
    在测试模块的declarations中添加TranslatePipe,结合mock的TranslateService使用:
    import { TranslatePipe } from '@ngx-translate/core';
    
    TestBed.configureTestingModule({
      declarations: [NavigationMainComponent, TranslatePipe],
      providers: [{ provide: TranslateService, useValue: translateServiceMock }],
    });
    
  • 方案B:使用Mock管道
    自定义Mock管道替代真实TranslatePipe,避免依赖内部逻辑:
    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({ name: 'translate' })
    class MockTranslatePipe implements PipeTransform {
      transform(value: string): string {
        return value; // 直接返回key作为模拟翻译结果
      }
    }
    
    // 测试模块配置
    TestBed.configureTestingModule({
      declarations: [NavigationMainComponent, MockTranslatePipe],
      providers: [{ provide: TranslateService, useValue: translateServiceMock }],
    });
    

验证

完成上述修改后,重新运行Jest测试,NavigationMainComponent › should create用例应能正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:27:43